Abfrage über Readings laufen lassen

Begonnen von Gidiano, 05 September 2019, 09:10:45

Vorheriges Thema - Nächstes Thema

Gidiano

Hallo zusammen,

ich bräuchte mal einen Schubs in die richtige Richtung. Aktuell breche ich mir gerade einen ab, wie ich am besten 8 Kanäle eines Device abfrage.
Situation:
Pro Kanal wird ein min und ein max Wert definiert (Temperaturen). Und es gibt eine gemessene Temperatur.
Außerdem wird das flag channel_1_alarm genutzt, um den Alarm ein oder aus zu schalten.

Die Readings sehen so aus:

channel_1_alarm  1  2019-09-04 16:51:50
channel_1_color   #0C4C88   2019-09-04 16:51:50
channel_1_max 200.00 2019-09-04 16:51:50
channel_1_min  10.00  2019-09-04 16:51:50
channel_1_name  Grill  2019-09-04 16:51:50
channel_1_number 1  2019-09-04 16:51:50
channel_1_temp  24.90  2019-09-04 16:51:50
channel_1_typ  0  2019-09-04 16:51:50
channel_2_alarm 0  2019-09-04 16:51:50
channel_2_color
...
und so weiter 8 x


Den Kanal 1 habe ich spaßeshalber mal mit einem DOIF ausprobiert, das geht ganz gut:
(Wenn der _alarm 1 ist und die Temperatur über 200°C ist ALARM, oder wenn _alarm 1 und Temp unter 20°C ist ALARM)
([WLANthermo:channel_1_alarm] eq 1 and [WLANthermo:channel_1_temp] > [WLANthermo:channel_1_max])
(set SynoChat WLANThermo :hamburger: Temperatur [WLANthermo:channel_1_name] zu hoch :hotsprings:)
DOELSEIF
([WLANthermo:channel_1_alarm] eq 1 and [WLANthermo:channel_1_temp] < [WLANthermo:channel_1_min])
(set SynoChat WLANThermo :hamburger: Temperatur [WLANthermo:channel_1_name] zu niedrig :snowflake:)


(Sowas wie :hamburger: sind Icons in der Chat App, die die Meldung anzeigt)
Und hier denke ich, dass ich wahrscheinlich eleganter über alle 8 Kanäle abfragen und gleich ausspucken kann, ob der Wert zu niedrig oder zu hoch ist.
Sind ja nur die Kanalnummern, die die Kanäle unterscheiden. "nur"... :o
Mit DOIF und Regex bin ich da nichts geworden. Ich denke auch, das ist ein Holzweg.
Hat wer einen Tipp, wie ich das angehen könnte?

Besten Dank und viele Grüße
Christian
Grüße,
Christian

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DeeSPe

Mit DOIF kenne ich mich (glücklicherweise) nicht aus.
Aber mit einem entsprechenden Code für ein notify kann ich dienen:
define n_WLANthermo_channel_x_alarm notify WLANthermo:channel_(\d)_alarm:.1 {
  my $id = $EVTPART0;
  if ($id =~ /^channel_(\d)_alarm:$/)
  {
    my $chan = ReadingsVal($NAME,"channel_".$1."_name","");
    my $temp = ReadingsNum($NAME,"channel_".$1."_temp",0);
    my $max = ReadingsNum($NAME,"channel_".$1."_max",0);
    my $min = ReadingsNum($NAME,"channel_".$1."_min",0);
    if ($temp > $max)
    {
      fhem "set SynoChat $NAME :hamburger: Temperatur $chan zu hoch :hotsprings:";
    }
    elsif ($temp < $min)
    {
      fhem "set SynoChat $NAME :hamburger: Temperatur $chan zu niedrig :snowflake:";
    }
  }
}


Das sollte genau das erledigen was Du möchtest, für alle Kanäle.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Damian

Die Frage ist, ob er bei jedem Event eine Ausgabe haben will, wenn nicht (was sein DOIF-Code ohne do always leistet), dann muss in den Perlcode noch eine "Zustandsverwaltung" pro Kanal hin.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gidiano

Oh fein, das brauche ich ja nur zu übernehmen, vielen Dank! (Perl ist nicht so meins...schäm  :-[)
Im Prinzip soll die Routine jedes mal eine Chatnachricht senden, wenn die Temperatur eines der Kanäle über- oder unterschritten wird.

Kann eventuell nervig werden, aber das probiere ich mal aus.

Beim DOIF (,das ich sehr gern nutze) war in diesem Hinblick auch die Option "Median" für mich interessant.

Besten Dank, ihr seid unglaublich!
Christian
Grüße,
Christian

Gidiano

Hallo,

das klappt schonmal, super.
Diese (und die andere) Zeile hatte ich anpassen müssen:
fhem "set SynoChat $NAME :hamburger: Temperatur $chan zu hoch :hotsprings:";
zu
fhem "set SynoChat WLANThermo :hamburger: Temperatur $chan zu hoch :hotsprings:";

WLANTHermo ist der feste Name für die Chat-App im HTTPMOD.

Allerdings werde ich jetzt mit Meldungen überschüttet, ich versuche das mal mit diesem Zustandsdingens von Damian (ich denke das meinte er).

Heißa, bin jetzt nen großen Schitt weiter :-)

Grüße
Christian
Grüße,
Christian

DeeSPe

Wie sieht es mit dem Überschütten von Nachrichten aus wenn Du in WLANthermo das Attribut event-on-change-reading auf "channel_\d_alarm" setzt?

Gruß
Dan

EDIT: Oder der Einfachheit halber:
attr WLANthermo event-on-change-reading .+
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Damian

Zitat von: DeeSPe am 05 September 2019, 14:23:57
Wie sieht es mit dem Überschütten von Nachrichten aus wenn Du in WLANthermo das Attribut event-on-change-reading auf "channel_\d_alarm" setzt?

Gruß
Dan

EDIT: Oder der Einfachheit halber:
attr WLANthermo event-on-change-reading .+

Das wird nicht reichen, du musst dir auch pro Kanal merken, welche Meldung zuletzt dran war, damit jeweils bei Über-/Unterschreitung nur einmal gemeldet wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gidiano

Zitat von: DeeSPe am 05 September 2019, 14:23:57
Wie sieht es mit dem Überschütten von Nachrichten aus wenn Du in WLANthermo das Attribut event-on-change-reading auf "channel_\d_alarm" setzt?

Hab gerade mal damit rumprobiert. Müsste ich nicht auch den Kanal ..._temp gehen? ..._alarm ist ja nur das flag 0 oder 1, ob überhaupt ein Alam ausgegeben werden soll.

Oha, dachte ich es mir doch, es ist doch (zumindest für mich) recht kniffelig.

Spannende Grüße
Christian
Grüße,
Christian

Gidiano

Zitat von: Damian am 05 September 2019, 16:02:32
Das wird nicht reichen, du musst dir auch pro Kanal merken, welche Meldung zuletzt dran war, damit jeweils bei Über-/Unterschreitung nur einmal gemeldet wird.

Erm... hüstel... da war sie wieder die Herausforderung....

Viele Grüße aus der rauchenden Birne
Christian
Grüße,
Christian

Damian

Zitat von: Gidiano am 05 September 2019, 16:08:38
Hab gerade mal damit rumprobiert. Müsste ich nicht auch den Kanal ..._temp gehen? ..._alarm ist ja nur das flag 0 oder 1, ob überhaupt ein Alam ausgegeben werden soll.

Oha, dachte ich es mir doch, es ist doch (zumindest für mich) recht kniffelig.

Spannende Grüße
Christian

Die Frage ist, ob alarm sauber auf 0 zurückgesetzt und nur bei Über-/Unterschreitung auf 1 gesetzt wird, wenn ja, dann kann man ruhig über alarm triggern und dann könnte event-on-change-reading schon reichen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gidiano

#11
Zitat von: Damian am 05 September 2019, 16:27:30
Die Frage ist, ob alarm sauber auf 0 zurückgesetzt und nur bei Über-/Unterschreitung auf 1 gesetzt wird, wenn ja, dann kann man ruhig über alarm triggern und dann könnte event-on-change-reading schon reichen.

Ich glaube da habe ich das unklar beschrieben, sorry. Das Gerät (ein Grillthermometer) hat ein Webinterface. Da kann ich (EDIT: pro Kanal) einen Haken setzen, ob die von mir eingestellte Temperatur-Range überhaupt was auslösen soll. Das resultiert dann in einer statischen 0 oder 1 und wird nur dadurch verändert, dass ich den Haken setze oder rausnehme.
Grüße,
Christian

Damian

Zitat von: Gidiano am 05 September 2019, 16:36:43
Ich glaube da habe ich das unklar beschrieben, sorry. Das Gerät (ein Grillthermometer) hat ein Webinterface. Da kann ich einen Haken setzen, ob die von mir eingestellte Temperatur-Range überhaupt was auslösen soll. Das resultiert dann in einer statischen 0 oder 1 und wird nur dadurch verändert, dass ich den Haken setze oder rausnehme.

Das habe mir schon gedacht, daher gilt, was ich vorher schon geschrieben habe: pro Kanal Zustand (Überschreitung/Unterschreitung) merken und für die Meldung zusätzlich auswerten: "Zustandsverwaltung", triggern über Temperatur. Ich würde es über Ereignisgesteuertes Perl (DOIF-Perl) realisieren ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gidiano

Zitat von: Damian am 05 September 2019, 16:40:04
Das habe mir schon gedacht, daher gilt, was ich vorher schon geschrieben habe: pro Kanal Zustand (Überschreitung/Unterschreitung) merken und für die Meldung zusätzlich auswerten: "Zustandsverwaltung", triggern über Temperatur. Ich würde es über Ereignisgesteuertes Perl (DOIF-Perl) realisieren ;)

Ich nehme die Herausforderung an!

Hier ein Demo Interface des Thermometers:
https://demo.wlanthermo.de/

Grüße
Christian
Grüße,
Christian

Damian

Man kann ja von dem Perlcode von @DeeSPe ausgehen, dazu braucht man nur noch eine Instanzvariable indiziert über die Kanalnummer als Merker nehmen und schon hat man´s. Jetzt sag' nicht, ich soll dir die paar Zeilen Code posten :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF