Ankündigung

Einklappen
Keine Ankündigung bisher.

Anzahl der 1wire Geräte pro Bus loggen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Anzahl der 1wire Geräte pro Bus loggen?

    Hallo,

    da meine 1w Busse leider nicht so stabil sind, würde ich gerne die Anzahl der Geräte je Bus loggen.

    Geht das mit Bordmitteln, oder brauche ich da eine Logik?
    (sprich: mit python im /mnt/1wire/ zählen)

    Gruß,
    Hendrik

    #2
    AW: Anzahl der 1wire Geräte pro Bus loggen?

    Halo Hendrik,

    Mir fällt spontan nichts besseres ein, als Dein Vorschlag.

    Was geminitored wird sind dagegen die Fehlerzähler, woraus auch die Ampelanzeige gewonnen wird.

    Ansich sollten wir den Bus so stabil bekommen, dass dies nicht passiert. Aber das behandeln wir im anderen Thread

    Stefan

    Kommentar


      #3
      Hallo,

      ok, das habe ich mal eingerichtet:
      Code:
      #!/usr/bin/python
      import os
      
      
      pfad="/mnt/1wire/uncached/bus.0/bus.0/"
      path, dirs, files = os.walk(pfad).next()
      file_count = len(dirs)
      sh.Daten.Anzahl_Bus_0(file_count-3)
      
      pfad="/mnt/1wire/uncached/bus.0/bus.1/"
      path, dirs, files = os.walk(pfad).next()
      file_count = len(dirs)
      sh.Daten.Anzahl_Bus_1(file_count-3)
      
      
      
      pfad="/mnt/1wire/uncached/bus.0/bus.2/"
      path, dirs, files = os.walk(pfad).next()
      file_count = len(dirs)
      sh.Daten.Anzahl_Bus_2(file_count-3)
      So kann ich das gut beobachten.
      Das soll nur bei der Fehlersuche helfen.

      Gruß&Danke,
      Hendrik

      Kommentar


        #4
        Code:
        while true; do sleep 1; owdir|wc; done
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


          #5
          Meine Erfahrung zeigt, dass die Anzeige der OW-Sensoren im "Baum" (Dateisystem oder Webserver) auch dann stark variiert, wenn die gerade nicht-sichtbaren Sensoren problemlos zu erreichen sind. Insbesondere wenn viele Sensoren am Bus hängen.

          Schätze dir wird nichts anderes übrig bleiben, als alle Sensoren durchzutesten. Bzw. guck mal im Onewire-Plugin: "problem reading"... Evtl. zu Beginn eines Zyklus Variable mit False initialisieren und bei einem Lesefehler True setzen - das ganze auf ein Item - wäre evtl. sogar ne schöne Erweiterung für andere!

          Grüße
          Robert (der gerade im Ferienhaus sitzt???)

          Kommentar


            #6
            Oder so für die 2x.xxxxxxx Sensoren auf Bus 3:

            Code:
            owdir /uncached/bus.3 | grep /2 | wc -l
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hi,

              Zitat von Robert Beitrag anzeigen
              guck mal im Onewire-Plugin: "problem reading"... Evtl. zu Beginn eines Zyklus Variable mit False initialisieren und bei einem Lesefehler True setzen - das ganze auf ein Item - wäre evtl. sogar ne schöne Erweiterung für andere!

              Grüße
              Robert (der gerade im Ferienhaus sitzt???)
              das Plugin differenziert nach drei Typen: normale Sensoren (Temp, Hum, ...), I/Os und iButtons.
              Für diese drei gibt es auch unterschiedliche Zyklen/Code.
              Für Sensoren und I/Os könnte man so etwas einbauen, für iButtons ist es nicht nötig.

              @Robert: bist Du unsicher ob Du im Ferienhaus sitzt?

              Bis bald

              Marcus

              Kommentar


                #8
                Zitat von mknx Beitrag anzeigen
                das Plugin differenziert nach drei Typen: [...]
                Hi Marcus,

                war mir klar - hatte ja auch schon etwas in dem OW-Plugin rumgepfuscht. ;-)

                Getrennt nach 1w-sen und 1w-io würde schon mal flexibel hinsichtlich der "Dringlichkeit" sein und 95% des Bedarfs abdecken. Noch besser wäre wohl nur noch eine weitere Aufschlüsselung nach Busmastern - da wird es dann aber etwas kniffliger.

                Grüße
                Robert

                Kommentar


                  #9
                  Ich habe mal was geschrieben, was aber getestet werden muss. Ich sitze hier fern der Heimat und kann leider keine Sensorausfälle auslösen.

                  Patch auf dem smarthome-Wurzelverzeichnis:
                  Code:
                  diff --git a/plugins/onewire/__init__.py b/plugins/onewire/__init__.py
                  index 3dcb5b2..a818573 100755
                  --- a/plugins/onewire/__init__.py
                  +++ b/plugins/onewire/__init__.py
                  @@ -234,6 +234,7 @@ class OneWire(OwBase):
                       _discovered = False
                       _flip = {0: '1', False: '1', 1: '0', True: '0', '0': True, '1': False}
                       _supported = {'T': 'Temperature', 'H': 'Humidity', 'V': 'Voltage', 'BM': 'Busmaster', 'B': 'iButton', 'L': 'Light/Lux', 'IA': 'Input A', 'IB': 'Input B', 'OA': 'Output A', 'OB': 'Output B', 'T9': 'Temperature 9Bit', 'T10': 'Temperature 10Bit', 'T11': 'Temperature 11Bit', 'T12': 'Temperature 12Bit'}
                  +    _monitoring = {}
                   
                       def __init__(self, smarthome, cycle=300, io_wait=5, button_wait=0.5, host='127.0.0.1', port=4304):
                           OwBase.__init__(self, host, port)
                  @@ -297,6 +298,7 @@ class OneWire(OwBase):
                       def _io_cycle(self):
                           if not self.is_connected:
                               return
                  +        read_errors = 0
                           for addr in self._ios:
                               for key in self._ios[addr]:
                                   if key.startswith('O'):  # ignore Output
                  @@ -314,8 +316,14 @@ class OneWire(OwBase):
                                           value = self._flip[self.read('/uncached' + path)]
                                   except Exception:
                                       logger.warning("1-Wire: problem reading {0}".format(addr))
                  +                    read_errors += 1
                                       continue
                                   item(value, '1-Wire', path)
                  +        if 'io_read_errors' in self._monitoring:
                  +            for item in self._monitoring['io_read_errors']['items']:
                  +                item(read_errors, '1-Wire-Monitoring')
                  +            for logic in self._monitoring['io_read_errors']['logics']:
                  +                logic.trigger('1-Wire-Monitoring', None, read_errors, None)
                   
                       def _ibutton_loop(self):
                           threading.currentThread().name = '1w-b'
                  @@ -360,6 +368,7 @@ class OneWire(OwBase):
                       def _sensor_cycle(self):
                           if not self.is_connected:
                               return
                  +        read_errors = 0
                           start = time.time()
                           for addr in self._sensors:
                               for key in self._sensors[addr]:
                  @@ -372,6 +381,7 @@ class OneWire(OwBase):
                                       value = self.read('/uncached' + path)
                                   except Exception:
                                       logger.info("1-Wire: problem reading {0}".format(addr))
                  +                    read_errors += 1
                                       if not self.is_connected:
                                           return
                                       else:
                  @@ -387,6 +397,11 @@ class OneWire(OwBase):
                                   item(value, '1-Wire', path)
                           cycletime = time.time() - start
                           logger.debug("cycle takes {0} seconds".format(cycletime))
                  +        if 'sensor_read_errors' in self._monitoring:
                  +            for item in self._monitoring['sensor_read_errors']['items']:
                  +                item(read_errors, '1-Wire-Monitoring')
                  +            for logic in self._monitoring['sensor_read_errors']['logics']:
                  +                logic.trigger('1-Wire-Monitoring', None, read_errors, None)
                   
                       def _discovery(self):
                           self._intruders = []  # reset intrusion detection
                  @@ -435,6 +450,13 @@ class OneWire(OwBase):
                           self._discovered = True
                   
                       def parse_item(self, item):
                  +        if 'ow_monitoring' in item.conf:
                  +            key = item.conf['ow_monitoring']
                  +            if not key in self._monitoring:
                  +                self._monitoring[key] = {'items': [item], 'logics': []}
                  +            else:
                  +                self._monitoring[key]['items'].append(item)
                  +            return
                           if 'ow_addr' not in item.conf:
                               return
                           if 'ow_sensor' not in item.conf:
                  @@ -464,5 +486,13 @@ class OneWire(OwBase):
                               item._ow_path = table[addr][key]
                               return self.update_item
                   
                  +    def parse_logic(self, logic):
                  +        if 'ow_monitoring' in logic.conf:
                  +            key = logic.conf['ow_monitoring']
                  +            if not key in self._monitoring:
                  +                self._monitoring[key] = {'items': [], 'logics': [logic]}
                  +            else:
                  +                self._monitoring[key]['logics'].append(logic)
                  +
                       def update_item(self, item, caller=None, source=None, dest=None):
                           self.write(item._ow_path['path'], self._flip[item()])
                  items.conf
                  Code:
                  [Onewire_Monitoring]
                    [[Lesefehler_IO_Geraete]]
                      type = bool
                      ow_monitoring = io_read_errors
                    [[Anzahl_Lesefehler_Sensoren]]
                      type = num
                      ow_monitoring = sensor_read_errors
                  Attributname und zulässige Werte sind ersichtlich. Durch den "type" wird entschieden, ob nur Bool oder Nummer ausgegeben werden.

                  Durch die Logik-Trigger kann im Fehlerfall auch direkt eine eMail gesendet werden etc.

                  Grüße
                  Robert

                  Kommentar


                    #10
                    Hallo Robert,

                    danke dafür!
                    Damit lässt sich jetzt die Summe der Fehler über alle Busmaster ermitteln, oder?
                    Ginge das auch je Busmaster, oder ist das nicht möglich, owfs-seitig?

                    Den anderen Danke für eure Tipps. Meine Logik läuft so wie ich sie gepostet habe. Spricht da etwas gegen? Aktualisiert ow-fuse automatisch den Bus, sobald ich auf ein Verzeichnis zugreife? (ich gucke ja in Uncached)

                    Edit: Welche Version ist Basis für den Patch? (Ich hab -glaube ich- die letzte Release Version und einige Rejects)

                    Gruß,
                    Hendrik

                    Kommentar

                    Lädt...
                    X