Heartbeat mit Mysensors?

Begonnen von maddinthebrain, 21 Mai 2019, 19:31:06

Vorheriges Thema - Nächstes Thema

maddinthebrain

Hallo zusammen,

Ich setze schon ein paar Mysensors Aktoren und Sensoren ein. Blöd ist nur, dass man nicht erfährt wann sie offline sind. Da gibt's doch was mit nem Heartbeat ähnlich wie bei MQTT. Hat das schon jemand gemacht?

Vielen Dank!

Viele Grüße
Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

alru

Moin,

genau dafür ist heartbeat da. Ich setze es auf 2 verschiedene Arten ein:

(1)
Bei Sensoren, die in ihrer Loop ein definiertes "sleep" haben, wird das heartbeat pro Loop einmal gesendet. Im fhem Device definiere ich dann ein entsprechendes "timoutAlive" Attribut. Das state Reading wird zu "dead", wenn das heartbeat nicht in der Zeit gesendet wird.

(2)
Bei Sensoren ohne "sleep", die also immer ansprechbar sind, sende ich mit einem at regelmäßig den Befehl "get <device> heartbeat". Auch hier wieder ein "timeoutAlive" definieren.

Wenn ein Sensor dann den state "dead" hat, lasse ich mir das über ein notify per Pushover senden. Funktioniert bisher zuverlässig.
Gruß,

Stefan
(Raspi 3B - Stretch / HM-LGW / HomeMatic / MySensors)

Beta-User

Ergänzend zu den Ausführungen von alru:

Auch meine nicht-schlafenden Nodes senden regelmäßig einen heartbeat, meist im Zusammenhang mit einer "sowieso"-Datenübertragung (in der Regel timer-gesteuert). Das ist dann typischerweise eine millis()-basierte Sache in den Sketches. Daher geht das bei mir ohne "at", anzeigen lasse ich das über eine readingsGroup.

Steht auch im Wiki: https://wiki.fhem.de/wiki/MySensors_Starter_Guide#alive.2C_NACK_und_dead

(ich habe eben noch den RG-Code auf die neulich leicht veränderte Funktionalität angepaßt).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

maddinthebrain

Wird das Heartbeat denn automatisch vom Node gesendet oder muss ich das im Sketch hinzufügen? Schon, oder?

Ich hätte void sendHeartbeat(); in der loop() z.B. alle 10s aufgerufen. Irgendwie mit wait(10000)...

Und sofern vorhanden statt der sleep() die void smartSleep() genommen.

GRüße Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

alru

Moin,

der Code (bei sieht bei mir so aus:
void loop() {
...
  // Update vom Reading heartbeat und state
    sendHeartbeat();
...
  sleep (SLEEP_TIME);
             }


Also kein "void" vor dem Heartbeat Befehl!

smartSleep setze ich nicht ein
Gruß,

Stefan
(Raspi 3B - Stretch / HM-LGW / HomeMatic / MySensors)

Beta-User

smartSleep macht dann Sinn, wenn die Node irgendwas vom Controller erwartet (tut sie in der Regel nicht), aber wenn, braucht es (vermutlich) keinen separaten heartbeat.

Für nicht-schlafende Nodes mache ich das millis()-basiert, Beispiel ist hier zu finden: https://github.com/rejoe2/MySensors_Small/blob/master/MyS097/MyS097.ino, habe leider grade nichts einfacheres gefunden.

Und: sind 10 Sek. nicht sehr kurz? Ich habe glaube nichts unter 1 Minute (der BME280, aber auch da nur, weil sonst das forecasting nicht funktioniert). Ansonsten sind es eher 3-5 Minuten, wobei ich in der Regel eine "verpasste" Message toleriere (also den Timeoutwert im Attribut >2 Zyklen wähle). Das häufige Senden kostet nur unnötig Batterie (und bei nicht schlafenden Nodes: kostet Bandbreite, ist ggf. nicht mal zulässig@868MHz wg. 1%!).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files