Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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!
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?
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.
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.
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)
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar