Hallo Init,
hallo Beta-User,
an einem guten Empfang führt mittel- bis langfristig kein weg vorbei. In einem Fall hatte ich sehr bescheidene Empfangsverhältnisse. Da ich ich bereits auf halbem Weg einen ESP8266 mit lediglich einem Relais verbaut hatte, habe ich diesem die Software von martin-ger (
https://github.com/martin-ger/esp_wifi_repeater) verpasst. Diese hat auch die freundliche Eigenschaft GPIOs zu schalten, so dass ich das angeschlossene Relais bedienen kann, und gleichzeitig einen Wlan-Repeater für den weit entfernten ESP8266 habe. Es ist ein Projekt für mehr als einen Samstagnachmittag (oder man kennt sich ansonsten sehr gut mit ES8266, Arduino, etc. aus), aber ich ich möchte dieses Teil nicht mehr missen.
In anderen Fällen habe ich gute Verbindungen, eigentlich, aber es kommt immer wieder vor, dass ein Teil aus der Reihe tanzt.
Aus diesem Grund erzeuge ich bei den infrage kommenden Fhem-Devices ein userReading mit dem Namen Zeitstempel, basierend auf irgendeinem Reading, welches wiederkehrend erneuert wird, z.B. uptime oder WiFi RSSI, oder dem Messwert/Sensor, den ich gerne überwachen möchte. Mit dem Modul monitoring überwache ich, ob bei einem Device das wiederkehrende Erneuern der Readings ausbleibt.
Meine Definition sieht wie folgt aus (neben Zeitstempel überwache ich auch noch Readings mit dem Namen Illuminance), der Code funktioniert nachgewiesenermaßen, so wie er hier steht:
defmod mymonitoring monitoring .*:(Zeitstempel.*|.*Illuminance.*)
attr mymonitoring alias monitor
attr mymonitoring errorReturn {return unless(@errors);;\
$_ = AttrVal($_, "alias", $_) foreach(@errors);;\
return("Das Gerät \"$errors[0]\" hat sich seit mehr als 2 Stunden nicht mehr gemeldet.") if(int(@errors) == 1);;\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
return(join("\n - ", "Die folgenden ".@errors." Geräte haben sich seit mehr als 2 Stunden nicht mehr gemeldet:", @errors))\
}
attr mymonitoring errorWait 7200
attr mymonitoring stateFormat {if (ReadingsVal($name,'warningCount','') > 0 and ReadingsVal($name,'errorCount','') > 0)\
{"<i>Warnung</i>:<br><span style='color:#2e5e87'>".(ReadingsVal($name,'mywarning',''))."</span><br>\
<i>Fehler</i>:<br><span style='color:#FF0000'>".(ReadingsVal($name,'myerror',''))."</span>"} \
elsif (ReadingsVal($name,'warningCount','') > 0)\
{"<i>Warnung</i>:<br><span style='color:#2e5e87'>".(ReadingsVal($name,'mywarning',''))."</span>"} \
elsif (ReadingsVal($name,'errorCount','') > 0)\
{"<i>Fehler</i>:<br><span style='color:#FF0000'>".(ReadingsVal($name,'myerror',''))."</span>"}}
attr mymonitoring userReadings myerror {my $ret = ReadingsVal($name,'error','');; $ret =~ s/,/<br>/g;; return $ret}, \
mywarning {my $ret = ReadingsVal($name,'warning','');; $ret =~ s/,/<br>/g;; return $ret}
attr mymonitoring warningReturn {return unless(@warnings);;\
$_ = AttrVal($_, "alias", $_) foreach(@warnings);;\
return("Das Gerät \"$warnings[0]\" hat sich seit mehr als 1 Stunde nicht mehr gemeldet.") if(int(@warnings) == 1);;\
@warnings = sort {lc($a) cmp lc($b)} @warnings;;\
return(join("\n - ", "Die folgenden ".@warnings." Geräte haben sich seit mehr als 1 Stunde nicht mehr gemeldet:", @warnings))\
}
attr mymonitoring warningWait 3600
Das Ganze ist auch behliflich, wenn der ESP8266 an sich läuft, aber der zu überwachende Sensor keine Daten mehr liefert, weil er defekt ist, oder was auch immer der Grund ist, - ich glaube ich habe schon alle möglichen Arten von Fehlern gehabt.
Viele Grüße Gisbert
Edit: kleine Einschränkung zum Code, "hat sich seit mehr als 2 Stunden nicht mehr gemeldet" steht so oder so ähnlich bei den Attributen insgesamt viermal drin, allerdings sehe ich davon nirgends etwas bei den Readings oder sonstigen Meldungen/Nachrichten. Vielleicht ist jemand so nett und erkärt mir, ob der Code an diesen Stellen sinnvoll und richtig ist, bzw. kann einen Vorschlag machen, wie ich es entfernen kann.