PCA301-Dosen überwachen bei Abwesendheit Maßnahmen einleiten.

Begonnen von subseven, 28 August 2019, 15:49:13

Vorheriges Thema - Nächstes Thema

subseven

Hallo zusammen,

da ich immer wieder mal das Problem mit abwesenden PCA301-Dosen habe, habe ich mir ein behilfs AT geschrieben, was ich mit euch teilen möchte.


+*00:15 {
my @pcaval=(devspec2array("TYPE=PCA301"));
my $pcanum = (devspec2array("TYPE=PCA301"));
$data{pcalastseenall} = 0;
while($pcanum > 0) {
$pcanum --;
fhem "set $pcaval[$pcanum] statusRequest";
$data{pcalastseen} = int((time() - time_str2num(InternalVal($pcaval[$pcanum],"PCA301_lastRcv",0))));
$data{pcalastseenall} = $data{pcalastseenall} + $data{pcalastseen};
if ($data{pcalastseen} >= 1800) {
fhem "set telegrambot message Steckdose $pcaval[$pcanum] seit mehr als 30min abwesend";
}
}
if ($data{pcalastseenall} >= 1800) {
fhem "set LacrosseGateway connect";
}
if ($data{pcalastseenall} >= 14400) {
fhem "set LacrosseGateway reboot";
fhem "set telegrambot message Kommunikation zu Steckdosen prüfen";
}
}


Die paar Zeilen lesen alle Dosen ein und fragen den Zeitpunkt des zuletzt empfangenem Telegrams ab. Ist die Summe aller "Fehlzeiten" höher als der Schwellwert von 30min wird versucht das LacrosseGatway erneut zu connecten.

Wird ein Schwellwert von gesamt 4 Stunden erreicht, wird versucht das Gateway neuzustarten.

Mir ist klar, dass die Summenbildung nicht ganz optimal ist, allerdings wird man dadurch beim Ausfall des Gateways sehr viel früher Informiert, als beim Ausfall einer einzelnen Dose.
Das hat für mich damit auch einen Vorteil.

Verbesserungsvorschläge nehme ich gerne an.

Grüße

Christoph Morrison

Schau dir mal map von Perl an. Damit kannst du das deutlich eleganter lösen als mit einer while-Schleife.
Ansonsten: D.h. du machst alle 15 Minuten einen Sturm von Status-Requests. Gibt es bei den Dingern keinen Duty Cycle?
Was passiert wenn du zufällig zeitlich passend zu dem 15-Minuten-Intervall eine PCA301 schalten will?

subseven

Danke für die Anmerkungen.

Die 15min Requests habe ich deinem Vorschlag nach angepasst. Einen DutyCycle konnte ich bisher noch nicht feststellen, auslesbar ist er jedenfalls nicht. Durch die Anpassung sind nun weniger Requests und nur wenn die Dose sich lange nicht gemeldet hat. Dadurch sollte es keine Kollision geben.
Regelt hier aber nicht fhem mit einer Queue?
Mit Map könnte ich mir die Befehle generieren lassen. Mir ist aber nicht ganz klar, wie ich meine Ausgaben und Prüfergebnisse weiter verarbeiten kann.

+*00:15 {
my @pcaval=(devspec2array("TYPE=PCA301"));
my $pcanum = (devspec2array("TYPE=PCA301"));
$data{pcalastseenall} = 0;
while($pcanum > 0) {
$pcanum --;
$data{pcalastseen} = int((time() - time_str2num(InternalVal($pcaval[$pcanum],"PCA301_lastRcv",0))));
$data{pcalastseenall} = $data{pcalastseenall} + $data{pcalastseen};
if ($data{pcalastseen} >= 1800) {
fhem "set $pcaval[$pcanum] statusRequest";
}
if ($data{pcalastseen} >= 3600) {
fhem "set telegrambot message Steckdose $pcaval[$pcanum] seit mehr als 60min abwesend";
fhem "set $pcaval[$pcanum] statusRequest";
}
}
if ($data{pcalastseenall} >= 1800) {
fhem "set LacrosseGateway connect";
}
if ($data{pcalastseenall} >= 14400) {
fhem "set LacrosseGateway reboot";
fhem "set telegrambot message Kommunikation zu Steckdosen prüfen";
}
}