Hallo zusammen,
ich versuche verzweifelt zu rechnen und es will irgendwie nicht.
Ich haben einen Regenmengensensor, mit einer Wippe, die einen Reedkontakt triggert.
Bei jedem umschlagen der Wipper erhalte in in FHEM ein Event (MQTT2_Tester:POWER:.on)
jetzt wollte ich gerne ein Reading in einem Dummy hochzählen lassen.
define MQTT2_Tester_notify_1 notify MQTT2_Tester:POWER:.on setreading tester Niederschlag_h {ReadingsVal("tester","Niederschlag_h",0)+1;;;; }\
hier erhalte ich anstelle einer 1
# READINGS:
# 2023-07-27 12:47:07 Niederschlag_h {ReadingsVal("tester","Niederschlag_h",0)+1;; }
Ich hatte diverse Formeln ausprobiert, die ich hier im Forum gefunden hatte.
Auch den Status hochzählen funktioniert igrendwie nicht.
(set tester {([tester]+1)})
da bekomme ich ne Errormeldung
STATE Bareword "tester" not allowed while "strict subs" in use at (eval 90653) line 1.
Ich würde gerne einen Dummy nehmen und dort 3 Reading mit erfassen.
Niederschlag_heute
Niederschlag_gestern
Niederschlag_der_letzten_3_Tage (vorgestern+gestern+heute)
Mein Gedanke war mit einem notify den heute-Zähler zu bedienen und mit einem at um Mitternacht den Zähler letzte_3_tage durch gestern+heute zu ersetzetn gestern durch heute zu überschreiben und heute auf 0 zu setzten.
was mach ich falsch?
Gruß
Dirk
Zitat von: dihe85 am 27 Juli 2023, 12:59:14was mach ich falsch?
Du vermischt planlos FHEM-Befehl und perl-Code.
Probier mal so:
define MQTT2_Tester_notify_1 notify MQTT2_Tester:POWER:.on { fhem("setreading tester Niederschlag_h ".ReadingsNum("tester","Niederschlag_h",0)+1) }
Rudi hat gerade die Tage (https://forum.fhem.de/index.php?topic=134010.msg1282525#msg1282525) ein Beispiel gezeigt, wie die korrekte Syntax ist FHEM-Befehl und perl-Code zu mischen.
Da gerade mal zwei Klammern fehlen, find ich das weit hergeholt das planlos zu bezeichnen:
define MQTT2_Tester_notify_1 notify MQTT2_Tester:POWER:.on setreading tester Niederschlag_h {(ReadingsNum("tester","Niederschlag_h",0)+1)}
Zitat von: TomLee am 27 Juli 2023, 13:30:19wie die korrekte Syntax ist FHEM-Befehl und perl-Code zu mischen.
Schlimm genug, dass dieser Unfug überhaupt eingebaut wurde. Führt einfach nur dazu, dass viele Anwender überhaupt nicht verstehen, was sie da eigentlich tun, wenn sie sich per copy&paste irgendwas zusammenfrickeln.
Und wenn man es irgendwann wirklich verstanden hat, bemerkt man ganz automatisch, dass man diese unsägliche Vermischung eigentlich gar nicht braucht, weil es auch komplett ohne geht.
ZitatSchlimm genug, dass dieser Unfug überhaupt eingebaut wurde. Führt einfach nur dazu, dass viele Anwender überhaupt nicht verstehen, was sie da eigentlich tun.
Und wenn man es irgendwann wirklich verstanden hat, bemerkt man ganz automatisch, dass man diese unsägliche Vermischung eigentlich gar nicht braucht.
Wenn ich ehrlich bin und aus dem schlussfolgere was ich bisher hier gelernt habe, stimm ich dir da in beiden Punkten zu.
OT 1:
+1 dafür, dass diese komische Syntax nicht wirklich hilfreich ist.
OT 2 an den TE:
Das sieht nach einem Tasmota-Device aus. Wenn du schon sowas nutzt, warum läßt du dann nicht den ESP zählen, indem du den PIN passend konfigurierst?
Hallo ihr zwei und danke für eure Hilfe.
Ich hatte mir das auch einfacher vorgestellt an das Reading zu kommen und damit zu rechnen. Die Klammersetzung hab ich bis heute nicht verstanden.
{} Definiert doch einen perl-code wenn ich das richtig verstanden habe.
Gruß Dirk
Hallo beta-user,
zu 1
????
Zu 2
Ja es ist nen d1 mini.
Der Counter wird nicht 1 sein sondern eher 0,33 oder so. (Muss ich noch berechnen)
Einen Pin als zähler im Tasomota zu hinterlegen hab ich noch nicht versucht.
Die Frage ist aber dann auch wie 0 ich den wieder und übertrage vorher den Zähler in die anderen Readings.
Ich möchte da zukünftig gerne eine Logik bauen die mich an das Bewässern erinnert. Dafür brauche ich auch die letzten Tage.
Gruß Dirk
Zitat von: dihe85 am 27 Juli 2023, 15:50:36Die Klammersetzung hab ich bis heute nicht verstanden.
{} Definiert doch einen perl-code wenn ich das richtig verstanden habe.
Grundsätzlich hast Du das gut verstanden. Es kommt aber auch noch darauf an, an welcher Stelle Du gerade bist und ob Du da überhaupt perl-code angeben darfst.
Prinzipiell gilt:
Alles, was Du mit FHEM-Befehlen machen kannst, kannst Du auch komplett in perl umsetzen.
Umgekehrt gilt das nicht.
Hallo betateilchen,
hab ich das denn richtig verstanden, das ich hier keine Möglichkeit habe die Daten direkt zu verarbeiten?
Also das auslesen und rechnen nicht direkt in Fhem geht?
Mit den Klammern wann eine runde und wann eine eckige....
Naja, TomLee hatte Dir ja eine Mischmasch-Lösung präsentiert.
Persönlich würde ich in so einem Fall immer auf reines perl wechseln, damit ist die Bedeutung jeder verwendeten Klammer, egal ob rund, geschweift oder eckig, auf jeden Fall eindeutig bestimmt.
Naja das Mischmasch enthält ja perl-code
Also ohne geht das wohl nicht.
Ich hatte ursprünglich gehofft, dass das verarbeiten von Readings "einfacher" wäre und ich die per : oder so abrufen kann.
Ähnlich den Bedingungen bei einem notify
So in der Art Tester:Niederschlag_h:+1
Du hast doch mit dem perl angefangen?
ReadingsVal() ist doch schon perl Code.
Natürlich kannst Du (in FHEM Code!) mit [device:reading] auf den Wert zugreifen.
Aber nicht damit rechnen, weil das halt eine von Rudi ausgedachte Syntax für FHEM Code ist, und FHEM kann nicht rechnen. Wozu auch? FHEM ist in perl programmiert und perl kann rechnen.
Deshalb wird alles, was Du in FHEM tust, letztendlich von perl ausgeführt.
Siehe mein oben geschriebener Grundsatz:
Alles, was Du mit FHEM-Befehlen machen kannst, kannst Du auch komplett in perl umsetzen.
Umgekehrt gilt das nicht.
Hallo betateilchen,
Ich hätte da noch 1-2 Fragen wenn das ok ist.
Interessanter Weise lief das notify bei den ersten Tests.
Jetzt wollte ich ein wenig damit testen und es reagiert nicht.
defmod MQTT2_Tester_notify_3 notify MQTT2_Tester:POWER:.on { fhem("setreading tester Niederschlag_h ".ReadingsNum("tester","Niederschlag_h",0)+1) }
Im log bekomme ich folgenden Eintrag
2023.08.01 15:57:04 1: PERL WARNING: Argument "setreading tester Niederschlag_h 0" isn't numeric in addition (+) at (eval 363215) line 1.
2023.08.01 15:57:04 3: eval: my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{ fhem("setreading tester Niederschlag_h ".ReadingsNum("tester","Niederschlag_h",0)+1) }
2023.08.01 15:57:04 3: 1 : Unknown command 1, try help.
2023.08.01 15:57:04 3: MQTT2_Tester_notify_3 return value: Unknown command 1, try help.
Das wäre die erste Frage.
Die zweite ist für mein Verständnis.
{ fhem("setreading tester Niederschlag_h " [hier kommt eine variable]}
Ich denke das ich die Syntax hier halbwegs begriffen habe. Was ich aber nicht verstehe und irgendwie auch nicht finden kann ist der Punkt vor readingsnum.
Angenommen ich würde zwei readings addieren wollen, dann müsste da doch dann für meine Variable folgendes stehen.
.readingsnum("device","reading",0)+. readingsnum("device","Reading",0)
Da motzt fhem allerdings die Formatierung an.
Readingsnum definiert wenn ich das richtig verstehe, dass das Reading als Zahlenwert "eingelesen" wird.
Und Readingsval???
Ich hoffe ich belässtige dich nicht zu sehr.
Gruß
Dirk
Das mit dem Punkt ist eine "concatenation", also eine Verknüpfung von Text.
Prinzipiell würde ich empfehlen, erst zu rechnen, und dann den ermittelten Wert mit interpolieren zu lassen.
defmod MQTT2_Tester_notify_3 notify MQTT2_Tester:POWER:.on { my $val=ReadingsNum("tester","Niederschlag_h",0)+1;; fhem("setreading tester Niederschlag_h $val")}
Hallo Beta-user,
danke für die Erläuterung.
Ich denke mir erscheint das trennen der Berechnung logischer.
Dann erläutert sich das Addieren von zwei Readings auch von alleine.
Das doppelte Semikolon steht für die Trennung der Befehle?
Wenn ich im notify dann zwei verschiedene Befehle ausführen würde, müsste ich dann wieder mit ;; trennen?
Gruß Dirk
Zitat von: dihe85 am 01 August 2023, 17:10:39Ich denke mir erscheint das trennen der Berechnung logischer.
Kann man so machen, ist aber unnötig.
Zitat von: dihe85 am 01 August 2023, 17:10:39Dann erläutert sich das Addieren von zwei Readings auch von alleine.
Das Addieren von readings hat nix mit dem Punkt zu tun.
Zitat von: dihe85 am 01 August 2023, 17:10:39Das doppelte Semikolon steht für die Trennung der Befehle?
Wenn ich im notify dann zwei verschiedene Befehle ausführen würde, müsste ich dann wieder mit ;; trennen?
Da sind wir wieder bei der Unterscheidung von perl-Code und FHEM-"Code".
Das Semikolon ist perl-Syntax. Ob Du ein oder zwei Semikolon braucht, kommt darauf an, an welcher Stelle in FHEM Du den perl-Code eingeben möchtest.
Zitat von: betateilchen am 01 August 2023, 17:14:29Zitat von: dihe85 am 01 August 2023, 17:10:39Ich denke mir erscheint das trennen der Berechnung logischer.
Kann man so machen, ist aber unnötig.
Ja
defmod MQTT2_Tester_notify_3 notify MQTT2_Tester:POWER:.on { fhem("setreading tester Niederschlag_h ".ReadingsNum("tester","Niederschlag_h",0)+1) }defmod MQTT2_Tester_notify_3 notify MQTT2_Tester:POWER:.on { fhem("setreading tester Niederschlag_h ".ReadingsNum("tester","Niederschlag_h",0)+1) }
Führte aber zu einer Fehlermeldung im log.
Ich habe bis jetzt nicht herausgefunden wieso.
Zusätzliche Klammern lösen zwar den Fehler, aber ich verstehe nicht wieso
defmod MQTT2_Tester_notify_3 notify MQTT2_Tester:POWER:.on { fhem("setreading tester Niederschlag_h ".(ReadingsNum("tester","Niederschlag_h",0)+1))}
Zitat von: betateilchen am 01 August 2023, 17:14:29Zitat von: dihe85 am 01 August 2023, 17:10:39Dann erläutert sich das Addieren von zwei Readings auch von alleine.
Das Addieren von readings hat nix mit dem Punkt zu tun.
Jupp verstanden der . ist das Verkettungszeichen.
Daher muss der vorranstehende Text auch mit einem Leerzeichen enden, damit die Fhem-Syntax stimmt.
Zitat von: betateilchen am 01 August 2023, 17:14:29Zitat von: dihe85 am 01 August 2023, 17:10:39.... müsste ich dann wieder mit ;; trennen?
Da sind wir wieder bei der Unterscheidung von perl-Code und FHEM-"Code".
Das Semikolon ist perl-Syntax. Ob Du ein oder zwei Semikolon braucht, kommt darauf an, an welcher Stelle in FHEM Du den perl-Code eingeben möchtest.
Und das hab ich noch nicht verstanden.
Ein Semikolon steht für das Ende eines Statements. OK soweit so gut also Ende der Befehlszeile. Und das zweite?
Zitat von: dihe85 am 01 August 2023, 21:31:41Ein Semikolon steht für das Ende eines Statements. OK soweit so gut also Ende der Befehlszeile. Und das zweite?
Langsam wird es langweilig.
Lies doch einfach in der FHEM commandref nach, da ist das unter "FHEM command types" exakt beschrieben.
ZitatMultiple FHEM commands are separated by semicolon (;). In order to use semicolon in perl code or shell programs, they have to be escaped by the double semicolon (;;). See the Notes section of the notify chapter on command parameters and escape rules.
Manchmal braucht man ja auch 4 Semikolon.
Aber das erkläre ich jetzt nicht auch noch.