FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Freee84neu am 05 November 2018, 01:12:58

Titel: userReading
Beitrag von: Freee84neu am 05 November 2018, 01:12:58
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
Titel: Antw:userReading
Beitrag von: Hans Franz am 05 November 2018, 01:39:13
elsif ($val <= 30 ) && ($val >= 3 )
Gruß
Hans
Titel: Antw:userReading
Beitrag von: Freee84neu am 05 November 2018, 02:07:20
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

Titel: Antw:userReading
Beitrag von: binford6000 am 05 November 2018, 03:32:41
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
Titel: Antw:userReading
Beitrag von: Freee84neu am 05 November 2018, 08:57:14
Super vielen Dank. Das wird wohl noch dauern bis ich das ganze richtig verstanden habe
Titel: Antw:userReading [Gelöst]
Beitrag von: Freee84neu am 09 November 2018, 10:58:32
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.



Titel: Antw:userReading
Beitrag von: Freee84neu am 09 November 2018, 11:35:01
($Event = ON)

das müsste denke ich schon mal so sein

($Event eq "ON")



Titel: Antw:userReading
Beitrag von: Byte09 am 09 November 2018, 11:39:05
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

Titel: Antw:userReading
Beitrag von: Freee84neu am 09 November 2018, 12:07:38
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  ???


Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 12:29:25
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.
Titel: Antw:userReading
Beitrag von: Freee84neu am 09 November 2018, 12:48:50
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




Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 13:27:11
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.
Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 13:33:08
Dummy Waschmaschine ist das selbe device wie das wo das userreading rein soll?
Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 13:52:04

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?
Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 13:55:36

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.
Titel: Antw:userReading
Beitrag 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
Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 14:13:12
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.
Titel: Antw:userReading
Beitrag von: Freee84neu am 09 November 2018, 14:24:19
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
Titel: Antw:userReading
Beitrag von: Freee84neu am 09 November 2018, 21:29:39
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
Titel: Antw:userReading
Beitrag von: CoolTux am 09 November 2018, 21:44:36
elsif ($val < 2 | $val > 30 ) {$val="off

elsif ($val < 2 || $val > 30 ) {$val="off
Titel: Antw:userReading
Beitrag von: Prof. Dr. Peter Henning am 10 November 2018, 08:56:16
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
Titel: Antw:userReading
Beitrag von: Freee84neu am 10 November 2018, 12:53:36
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 ...