Hallo
Habe ein userReading angeklagt welches wie folgt lautet
Betrieb { my $val=ReadingsVal("Waschmaschine", "ENERGY_Power", ""); if ($val > 30) { $val="on";} elsif ($val <= 30 ) { $val="off";} ;; $val}
Also das Reading Betrieb geht bei höher 30 auf on und bei 30 oder niedriger auf off
Sowei recht einfach
Jetzt würde ich gerne aber auch standby rein bekommen
Also >30 on
Zwischen 30 und 3 standby
Unter 3 off
Jetzt stehe ich voll auf dem Schlauch wie ich das standby mit reinbekomme
Wäre nett wenn jemand helfen könnte
elsif ($val <= 30 ) && ($val >= 3 )
Gruß
Hans
Betrieb { my $val=ReadingsVal("Waschmaschine", "ENERGY_Power", ""); if ($val > 30) { $val="on";} elsif ($val < 3 ) { $val="off";} elsif ($val <= 30 ) && ($val >= 3 ) { $val="standby";} ;; $val}
Error evaluating Waschmaschine userReading Betrieb: syntax error at (eval 2374424) line 1, near ") &&"
Global symbol "$val" requires explicit package name at (eval 2374424) line 1.
syntax error at (eval 2374424) line 1, near "$val}"
Klappt auch nicht das ist noch zu hoch für mich sorry
Die zwei Klammern um das && sind zuviel ;)
Also:
Betrieb {my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val > 30) {$val="on";} elsif ($val < 3) {$val="off";} elsif ($val <= 30 && $val >= 3) {$val="standby";};$val}
VG Sebastian
Super vielen Dank. Das wird wohl noch dauern bis ich das ganze richtig verstanden habe
Hallo nochmal
würde gerne in einem userReading zählen wie oft das ON im State reinkommt.
ich habe sowas ähnliches schon über ein notify aber ich würde es gerne direkt über das reading machen wollen
Ich hatte an das hier gedacht aber irgendwas ist wohl Falsch. ;) , hab das ganz noch nicht so verstand ....
ON {my $val=ReadingsVal("Dummy_Waschmaschine","state",""); if ($val = ON) {$val="+1";} else {$val="+0";};$val}
oder
ON {my $Wert=ReadingsVal("Dummy_Waschmaschine","state",""); if ($Event = ON) {$Wert="+1";} else {$Wert="+0";};$Wert}
Wäre nett wenn mir jemand auf die Sprünge helfen könnte.
($Event = ON)
das müsste denke ich schon mal so sein
($Event eq "ON")
Nur auf die schnelle gesehen:
String Vergleich nicht mit '=' sondern mt 'eq'
Addition '$val=$val + 1' oder '$val++'
Bitte unbedingt in perl Grundlagen einarbeiten.... da führt kein Weg vorbei.
Gruss Byte09
Gesendet von meinem SM-G900F mit Tapatalk
ja ich muss auf jeden Fall an einen Perl Grundlagen arbeiten ::) aber irgendwie bekomme ich das nicht in den Kopf
ON {my $val=ReadingsVal("Dummy_Waschmaschine","state",""); if ($Event eq "ON") {$val = $val +1 ;} else {$val = $val +0 ;};$val}
das ist wohl auch was falsch
Danke schon mal
PS. wenn ich "($Event eq "ON")" nehme Bräuchte ich doch garnicht ""else {$val = $val +0 ;}"" mit rein nehmen oder ? das wäre doch nur wenn ich auf alle Events reagieren würde oder hab ich das ganze total fasch verstanden, jetzt bin ich wohl total durcheinander ???
Im Grunde funktioniert es eigentlich wie beim Notify, eigentlich brauchst Du gar keine Abfrage wenn das RegEx passt
ON { if ( $EVENT eq "ON" ) { ReadingsVal("Dummy_Waschmaschine","state","") +1 } }
Bei dieser Form reagiert das userReadings auf alle Events zu seinem Device. Wenn Du lediglich auf den state Event reagieren möchtest, musst du das mit an geben
ON:ON { ReadingsVal("Dummy_Waschmaschine","state","") +1 }
Allerdings scheint state ja kein ON OFF zu liefern sondern numerische Werte wen ich das richtig interpretiere.
Danke für die Hilfe
mein state gibt "ON" "OFF" und "STANDBY" raus und wollte zählen wie off "ON" reinkommt
jetzt bin ich durchander...
ON { if ( $EVENT eq "ON" ) { ReadingsVal("Dummy_Waschmaschine","state","") +1 } }
"ON" name des userReadings
"""{ if ( $EVENT eq "ON" )""" wenn das eintrift also ein Event mit ON
""""{ ReadingsVal("Dummy_Waschmaschine","state","") +1 }""" dann soll er das machen also state +1 setzen
jetzt stehe ich voll auf dem schlauch oder hab ich es richtig verstanden
Nein das wird so nicht.
ReadingsVal("Dummy_Waschmaschine","state","") +1
Bedeutet, lese den Wert aus dem Reading state aus und addiere 1 dazu. Das geht aber nur wenn der Wert auch eine Zahl ist und kein String.
Du solltest auch eigentlich Fehlermedungen im log haben.
Du kannst das ganze aber testen. Einfach zwei Dummys zusammen setzen und damit üben.
Dummy Waschmaschine ist das selbe device wie das wo das userreading rein soll?
Internals:
CFGFN
NAME dummyWaschmaschine
NR 24
STATE ON
TYPE dummy
OLDREADINGS:
READINGS:
2018-11-09 06:50:32 ON ON
2018-11-09 06:50:32 state ON
Attributes:
readingList state
room Test
setList state:ON,OFF,STANDBY
userReadings ON:ON { ReadingsVal($name,'state','none') }
Das liefert Dir erstmal ein Reading ON mit dem Wert von state. Was genau willst Du nun machen? Du willst wissen wie oft der Event ON kam?
Internals:
CFGFN
NAME dummyWaschmaschine
NR 24
STATE ON
TYPE dummy
OLDREADINGS:
READINGS:
2018-11-09 06:53:28 ON 2
2018-11-09 06:53:28 state ON
Attributes:
readingList state
room Test
setList state:ON,OFF,STANDBY
userReadings ON:ON { ReadingsVal($name,'ON',0) + 1 }
Das zählt Dir Deine ON Evente von state.
Vielen Dank
zum verständinis
ON:ON { ReadingsVal($name,'ON',0) + 1 } wie baut sich das jetzt auf
On der Name der Readings
On auf was er reagiert
dann ein set im deviece mit dem selbem Namen ""$name"" in das reading ""On""
oder wie soll ich das verstehen
aber vielen vielen dank
Zitat von: Freee84neu am 09 November 2018, 14:05:38
Vielen Dank
zum verständinis
ON:ON { ReadingsVal($name,'ON',0) + 1 } wie baut sich das jetzt auf
On der Name der Readings
On auf was er reagiert
dann ein set im deviece mit dem selbem Namen ""$name"" in das reading ""On""
oder wie soll ich das verstehen
aber vielen vielen dank
Ich erkläre es Dir gerne, aber bitte sei so nett und schaue Dir in Zukunft vorher Beispiele in der Commandref oder im Wiki an.
ON:ON { ReadingsVal($name,'ON',0) + 1 } wie baut sich das jetzt auf
Das erste ON ist der Name welches als userReading hinterlegt werden soll. Das :ON dahinter ist die RegEx auf die vom Event getriggert werden soll. Danach kommt Perlcode
ReadingsVal($name,'ON',0) + 1 }
ReadingsVal ist eine Perlfunktion welche in der fhem.pl zu finden ist, dieser Funktion übergeben wir den Namen des Devices von welchen wir lesen wollen, $name ist eine Variable welche beim Event mitgegeben wird und die nutzen wir gleich mal. 'ON' ist der Name des Readings von welchen wir lesen wollen. Die 0 dahinter ist der default Wert welcher zurückgegeben wird wenn von dem Device mit dem Reading nicht gelesen werden kann. Zum Beispiel beim aller ersten mal.
Vielen dank ich denke das hab ich verstanden
muss aber auch leider sagen das ich vorher in die Commandref geschaut habe aber leider hat es mir nicht wirklich geholfen.
da hab ich aus anderen userReadings was zusammen geschrieben ... was leider doch sehr weit weg war von dem was richtig war ...
dank nochmal
gruß Mike
Habe dieses userReading jetzt und seit heut nachmittag bekomm ich fehler im logfile
Betrieb { my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val > 30) {$val="on";} elsif ($val <= 2) {$val="off";} elsif ($val <= 30 && $val >2) {$val="standby";};$val},Standby { my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val <= 30 && $val >= 2) {$val="on";} elsif ($val < 2 | $val > 30 ) {$val="off";} ;; $val},On { my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val > 10) {$val="on";} elsif ($val <= 10 ) {$val="off";} ;; $val},Off { my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val > 2) {$val="off";} elsif ($val <= 2 ) {$val="on";} ;; $val},Waschvorgaenge { ReadingsVal("Dummy_Waschmaschine","Waschvorgaenge",0) ;;}
2018.11.09 21:21:14 1: PERL WARNING: Possible precedence problem on bitwise | operator at (eval 30447) line 1.
2018.11.09 21:21:14 3: eval: { my $val=ReadingsVal("Waschmaschine","ENERGY_Power",""); if ($val <= 30 && $val >= 2) {$val="on";} elsif ($val < 2 | $val > 30 ) {$val="off";} ;; $val}
kann mir einer auf die sprüge helfen
elsif ($val < 2 | $val > 30 ) {$val="off
elsif ($val < 2 || $val > 30 ) {$val="off
Ich bringe seit mehr als 40 Jahren anderen Menschen das Programmieren bei und kann ganz klar sagen: So wird das nichts.
Freee84neu hat leider noch nicht einmal den Unterschied zwischen der Ebene der FHEM-Skriptsprache und der Perl-Ebene verstanden. Ich schlage deshalb vor, sich die Anfängerdoku von FHEM noch einmal anzusehen, und Perl an Hand einer anderen Dokumentation zu lernen, z.B. http://www.tekromancer.com/perl2/inhalt.html
LG
pah
Danke
Es hat ja seit ein paar Tage funktioniert muss wohl beim ändern verloren gegangen sein. Und ist mir leider nicht aufgefallen.
Und ja ich komm damit noch nicht wirklich klar. Und ich muss mich da wirklich noch einarbeiten das will ich nicht abstreiten ...