Hauptmenü

Rechnen mit Pearl

Begonnen von MarkoP, 27 Januar 2020, 12:05:30

Vorheriges Thema - Nächstes Thema

MarkoP

Hallo,

ich bräuchte mal Hilfe bei der Umsetzung einer Idee.
Ich möchte verschiedene Dinge schalten in Abhängigkeit der Anwesenden Personen.
Darum würde ich gerne einen Dummy die anwesende Personenzahl einmal zuweisen und dann den Dummy jeweils um eins erhöhen/verkleinern wenn eine Anwesenheits-/Abwesenheitsmeldung reinkommt. Sollte der Dummy als Wert 0 haben werden dann bestimmte Aktionen wie Heizungssteuerung etc. aktiviert.

Leider bekomme ich das mit dem Rechnen nicht hin. Alle meine Versuche hatten keine Auswirkungen.
Den aktuelle Code kann ich gerne heute Abend noch hinzufügen, komme aber jetzt von der Arbeit nicht dran.

Aber vielleicht hat ja bis dahin schon jemand eine Idee oder gar Lösung für mich.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Beta-User

Hmm, es gibt da zwei Module, die das evtl. einfacher, aber etwas anders "können":

Zum einen die Module aus der Residents-Modulfamilie, die speziell u.A. dazu da sind, Anwesenheiten zu strukturieren.

Ich habe zu diesem Zweck teilweise noch "structure" im Einsatz. Das kann man auch so einstellen, dass die structure auf "anwesend" geht, wenn nur ein Beteiligter da ist usw..
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

CoolTux

Und ändere mit Pearl in Perl.
Das eine ist ein Versandhaus das andere eine Programmiersprache.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Hi,

Rechnen geht mit perl und Perl braucht in dem Fall die () zusätzlich. Die "Reading Form" set magic funktioniert. ;)
Beispiel: Zählt entweder 2 hoch oder 1 runter
define zaehlen notify schalter:(on|off) IF ("$EVENT" eq "on") (set testzaehler {([testzaehler:state] + 2)}) ELSE (set testzaehler {([testzaehler:state] - 1)})

Tipp: es gibt count - Beispiel (gibt mir derzeit die Zahl 5 zurück)
count Person.*:FILTER=STATE=absent raw

Zitat von: CoolTux am 27 Januar 2020, 12:12:58
Und ändere mit Pearl in Perl.
Das eine ist ein Versandhaus das andere eine Programmiersprache.
Nicht nur Versandhaus, es gibt auch Pearl als Sprache, aber die spielt bei FHEM keine Rolle https://de.wikipedia.org/wiki/PEARL

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MarkoP

@Beta-User
Die Erkennung ist ja praktisch gleich wie bei mir, aber das mit dem structure ist für mich neu. Dazu gleich eine Frage, kann ich auch eine Gruppe die mit structure zusammengefasst wurde in eine andere structure-Gruppe einbinden, also Gruppe in Gruppe in Gruppe etc.?
Das würde mir viele Möglichkeiten eröffnen.

@Otto123
werde ich probieren weil es sicherlich immer mal gebraucht werden kann.
Ich muss also erst das Device (testzaehler) ansprechen und dann noch aml den Devicenamen gefolgt vom Readingsnamen in eckige Klammern setzen?
Ich komme noch nicht mit der Anzahl und Art der Klammern klar. die geschweifte und die normale Klammer umschließen den gleichen Begriffsteil. Wenn ich Perl richtig verstehe kennzeichnet die geschweifte Klammer dabei lediglich die Funktion, richtig?
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

CoolTux

Zitat von: MarkoP am 28 Januar 2020, 14:02:57
@Beta-User
Die Erkennung ist ja praktisch gleich wie bei mir, aber das mit dem structure ist für mich neu. Dazu gleich eine Frage, kann ich auch eine Gruppe die mit structure zusammengefasst wurde in eine andere structure-Gruppe einbinden, also Gruppe in Gruppe in Gruppe etc.?
Das würde mir viele Möglichkeiten eröffnen.

Ja kannst Du. Ich verwende das sehr intensiv im Bereich Licht und Verbraucher.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Ja, man kann auch structure zum Teil einer structure machen

Zu Otto's Code meine 2ct: Das ist ganz nett, aber am Ende finde ich es zwischenzeitlich am einfachsten, wenn, dann vollständig auf Perl-Ebene zu wechseln. Alles andere führt am Ende tendenziell zu Unübersichtlichkeit.
Sollte in diese Richtung funktionieren
{my $newvalue = ReadingsVal("testzaehler","state",0);; if ("$EVENT" eq "on") { $newvalue += 2 } else { $newvalue -= 1 };; fhem "set testzaehler $newvalue"}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

#7
ZitatDarum würde ich gerne einen Dummy die anwesende Personenzahl einmal zuweisen und dann den Dummy jeweils um eins erhöhen/verkleinern wenn eine Anwesenheits-/Abwesenheitsmeldung reinkommt.
set Dummy 4 setzt den STATE des Dummy auf 4
[Dummy] ist der set magic bzw. DOIF Syntax für die perl Funktion {Value("Dummy")}
set Dummy {([Dummy]+1)} ist der set magic Syntax für die Perl Funktion {Value("Dummy")+1}
Es liest den Dummy aus, erhöht um 1 und schreibt den Wert in den Dummy zurück. Es ist ein set Befehl und in {} steht die Rechnung.

FHEM braucht bei FHEM Befehlen mit Perl Ausdrücken ein paar zusätzliche  runde Klammern {(Value("Dummy")+1)} diese Beschreibung findest Du bei set in Doku.

Wenn Du den Trigger von meinem Code an Deinen anpasst kannst Du alles so wie es ist verwenden. In der Art.
Person.*:(absent|present)

Was ist noch unklar?

Gruß Otto

P.S. Allerdings ist structure für deinen Fall wesentlich besser. Die Zählung führt schnell zur "Überwachung durch den Geheimdienst": Wenn jetzt noch zwei rein gehen ist keiner mehr drin. ;D
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MarkoP

@Beta-User
Wenn ich es richtig lese besteht der eigentliche Unterschied darin, dass deine Variation den Wert erst in eine Variable schreibt und diese dann dem Reading zuweißt, oder?

@Otto123
Unklar ist einiges, grins
Nein im Ernst, die {} kennzeichnen die Funktion, das ist mir bewusst. die einfachen Klammern um das "Dummy" sind auch nachvollziehbar, lediglich die anderen einfachen Klammern nicht, da sie nichts anderes als auch die geschweiften Klammern umfassen/beinhalten. Es geht ja nicht nur darum abzutippen, sondern auch zu verstehen.
Zu deinem PS, ja, denke auch, das in diesem Fall das structure die bessere Lösung ist, aber wie schon geschrieben gibt es ja viele Anwendungsmöglichkeiten für Berechnnungen innerhalb von Fhem. Und das mit dem zwei gleichzeitig reingehen könnte in meinem Fall nicht passieren, da ich ja ein notify auf das state-Reading des Benutzers gesetzt habe. Dieser wird ja für jeden Benutzer einzelnd ausgelöst, egal ob man zu zweit reingeht oder einzelnd.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Beta-User

Nein. Mein Code nutzt nur Perl-Funktionen aus fhem.pl und den allg. Perl-libs.

Die Variante von Otto123 nutzt "set magic" (kannst du selbst in der commandref finden), dazu eine Kapselung durch IF (ein Hilfsmodul). Beides soll dem Anfänger helfen, aber wie gesagt, nach meinem Empfinden macht es das nicht einfacher, sondern am Ende unübersichtlicher, zumal man auch keine Abkürzungen nutzen kann wie z.B. diese:

{my $newvalue = ReadingsVal("testzaehler","state",0);; "$EVENT" eq "on" ? $newvalue += 2 : $newvalue -= 1 ;; fhem "set testzaehler $newvalue"}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

#10
die zusätzlichen runden Klammern sind von "set magic", das ist einfach der FHEM Syntax. Genau wie die doppelten ;; :)
https://commandref.fhem.de/#set

Da ich set magic mag, mal noch eine kurze Perl Variante (Variablenarm ;) )
set testzaehler {(ReadingsNum("testzaehler","state",99)+($EVENT eq "on"?2:-1))}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MarkoP

Für meinen Fall (also das ein Device seinen state auf "absent" wechselt wenn eine Person das Haus verlässt, müsste ich deine Zeile wie folgt abändern:
set Anwesenheit {(ReadingsNum("PersonX","state",99)+($EVENT eq "abcent"?-1:+1))}
Wobei mir der Sinn der 99 nicht klar ist

@Beta-User
Da ich ziemlich VB bzw. VBA lastig bin finde ich die Variante von Otto123 einfacher als deine.
Liegt vermutlich aber daran, dass die Syntex mehr Ähnlichkeit aufweist.
Aber sicherlich haben beide Varianten ihren Sinn.

@All
Danke ihr zwei, werde am Wochenende mal genauer damit rumspielen und einiges ausprobieren. Werde aber auf jedenfall auch das structure ausprobieren. Das scheint mir bei diesem Einsatzzweck die einfachste Variante zu sein.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Otto123

Da kann irgendetwas stehen, was Du als falsch identifizieren kannst. Die Funktionen sind alle nach dem Schema aufgebaut: ReadingsXXX("Gerät","Reading",Defaultwert wenn das Reading leer ist oder nicht lesbar ist)
Wobei du schauen musst: Steht wirklich nur absent im Event?
Den Trigger im notify musst Du auf (absent|present) beschränken.
Der Zähler PersonX muss initialisiert werden.

Insgesamt ist eine structure für diesen Fall wirklich einfacher, musst Du aber entscheiden und testen.

Ich habe vor Jahren mal das dazu aufgeschrieben.

Viel Erfolg
Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz