FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: theotherhalf am 30 Dezember 2018, 18:21:20

Titel: Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:21:20
Ich möchte gerne mit folgendem Kommando einen Wert aus FHEM "on" oder "off" in die CCU senden und das ganze abhängig vom Status nach "1" oder "0" konvertieren.

define Status_Umwaelzpumpe_Therme_zur_HomematicCCU_Systemvariable at +*00:02 { if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" ) { fhem("set CCU var Status_Umwaelzpumpe_Therme 1") } else { fhem("set CCU var Status_Umwaelzpumpe_Therme 0") }}

Leider wird nur eine 0 gesendet, unabängig vom Status der Pumpe. Ist die Abfrage "eq" so korrekt formuliert?
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:26:34
Hi,

stimmt denn das Reading?
Zitat(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme" ...

Gruß Otto
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:28:40

Ja, das Reading stimmt so, es hat zweimal den gleichen Namen.
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:29:30
Dann zeig mal bitte ein list Umwaelzpumpe_Therme
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:29:59
Nach dem selben Schema sende ich ohne Probleme weitere Variablen, allerdings alles Zahlenwerte.
Dies ist der erste String.
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:31:28
Internals:
   DEF        bai00.class
   IODev      EBUS2
   NAME       Umwaelzpumpe_Therme
   NR         151
   STATE      Umwaelzpumpe_Therme off


   TYPE       ECMDDevice
   READINGS:
     2018-12-30 18:30:14   Umwaelzpumpe_Therme off


     2018-12-30 18:30:14   state           Umwaelzpumpe_Therme off


   fhem:
     classname  bai00.class
     cache:
       specials:
         %NAME      Umwaelzpumpe_Therme
         %TYPE      ECMDDevice
Attributes:
   IODev      EBUS2
   group      Vaillant
   icon       sani_supply_temp
   room       Vaillant
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:31:41
Du sendest eine Zahl  :-X Du fragst einen String ab  ;)
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:34:28
Ja, die Abfrage ist on/off, da das Reading so ist.
Ich möchte aber zur CCU 1 oder 0 senden, da ich dies in einer Grafik weiter verwenden kann.
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:34:57
Ich sehe keinen Fehler.

Probiere doch den Ausführungsteil einfach in der FHEM Kommandozeile, beim entsprechenden Status des readings
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" ) { fhem("set CCU var Status_Umwaelzpumpe_Therme 1") } else { fhem("set CCU var Status_Umwaelzpumpe_Therme 0") }}
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:38:21
habe ihm gerade mal bei "else" auch eine 1 editiert. Die wird dann auch zur CCU geschrieben, ich kann es auf der CCU Seite sehen.
Irgendwie gefällt ihm die on/off Abfrage nicht so recht, er sieht die als falsch an un sendet über "else" die ganze Zeit.
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:39:39
Da frage doch in der Kommandozeile den Wert ab und schau ob er stimmt, bisher war er ja off und nicht on  ::){ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","")}
Du kannst auch den Test testen:
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" )}
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 18:46:19
Zitat von: Otto123 am 30 Dezember 2018, 18:39:39
Da frage doch in der Kommandozeile den Wert ab und schau ob er stimmt, bisher war er ja off und nicht on  ::){ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","")}
Du kannst auch den Test testen:
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" )}

Die 1. Abfrage ergibt off, muss da warten bis die Pumpe wieder läuft.

Die zweite Abfrage ergibt einen Syntax Fehler:

syntax error at (eval 2047) line 1, at EOF
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 18:52:10
Ja ok, da fehlte natürlich was  :-[
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" ){"wahr"}else{"falsch"}}
oder die Kehrseite um die Wartezeit zu überrücken
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "off" ){"wahr"}else{"falsch"}}
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 19:00:50
jetzt läuft die Pumpe und ich bekomme auch ein "on" wenn ich
{ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","")}

eingebe

Gebe ich die vollständige Zeile ein:
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "on" ) { fhem("set CCU var Status_Umwaelzpumpe_Therme 1") } else { fhem("set CCU var Status_Umwaelzpumpe_Therme 0") }}
kommt in der CCU nur eine "0" an.
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 19:04:26
und wenn ich:
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "off" ) { fhem("set CCU var Status_Umwaelzpumpe_Therme 1") } else { fhem("set CCU var Status_Umwaelzpumpe_Therme 0") }}

eingebe, kommt auch eine 0.. Ihm gefällt die Abfrage wohl nicht, springt immer zu "else"
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 19:25:51
Hast Du das aus meiner Antwort #12 mal getestet?
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 19:59:58
Zitat von: Otto123 am 30 Dezember 2018, 19:25:51
Hast Du das aus meiner Antwort #12 mal getestet?

Ja, hab ich getestet:
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") eq "off" ){"wahr"}else{"falsch"}}

ergibt "falsch" wenn die Pumpe aus ist und auch "falsch" wenn sie an ist.
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 20:05:17
Sehr merkwürdig. Wir haben jetzt alles getestet ...  :-\
{ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","")} ergab on bzw off
NEIN :o
Jetzt sehe ich es!!!
ZitatREADINGS:
     2018-12-30 18:30:14   Umwaelzpumpe_Therme off


     2018-12-30 18:30:14   state           Umwaelzpumpe_Therme off
Normal sollte das so aussehen:
ZitatREADINGS:
     2018-12-30 18:30:14   Umwaelzpumpe_Therme off
     2018-12-30 18:30:14   state           Umwaelzpumpe_Therme off

Hinter dem off sind weitere Zeichen - unsichtbar!!! Es gibt Zeilenumbrüche

Ändere mal die Abfrage: 
if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/off/i )

Zur Erklärung: der Ausdruck "=~ m/off/i" testet nicht ob "off gleich off" ist, sondern ob im linken String der Ausdruck off enthalten ist. Groß und Kleinschreibung spielt keine Rolle.
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 20:12:07
if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/on/i ) {"wahr"}else{"falsch"}}

Unknown command if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme",""), try help.
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 20:16:01
Zitat von: Otto123 am 30 Dezember 2018, 20:05:17
Sehr merkwürdig. Wir haben jetzt alles getestet ...  :-\
{ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","")} ergab on bzw off
NEIN :o
Jetzt sehe ich es!!!Hinter dem off sind weitere Zeichen - unsichtbar!!! Es gibt Zeilenumbrüche

Ändere mal die Abfrage: 
if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/off/i )

Ich habe für den Wert bereits ein Readings Proxy in Verwendung um es in einem Floorplan darzustellen.
Der sollte bereinigt sein um die Leerzeichen. Ich probiere den mal.
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 20:19:22
Zitat von: theotherhalf am 30 Dezember 2018, 20:12:07
if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/on/i ) {"wahr"}else{"falsch"}}

Unknown command if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme",""), try help.
Da fehlt die Klammer { am Anfang!

Es sind nicht nur Leerzeichen!
Titel: Antw:Syntax bei if...else
Beitrag von: theotherhalf am 30 Dezember 2018, 20:27:34
Funktioniert! Das war es!
{ if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/on/i ) { fhem("set CCU var Status_Umwaelzpumpe_Therme 1") } else { fhem("set CCU var Status_Umwaelzpumpe_Therme 0") }}

So steht es nun in der cfg.
Kannst du mir den Ausdruck =~ m/on/i etwas erklären?

Danke dir für deine super Hilfe!!!!!!!!!
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 20:30:24
habe #17 editiert :)
Titel: Antw:Syntax bei if...else
Beitrag von: JoWiemann am 30 Dezember 2018, 20:33:51
Zitat von: theotherhalf am 30 Dezember 2018, 20:27:34
Kannst du mir den Ausdruck =~ m/on/i etwas erklären?


=~ leitet einen regulären Ausdruck ein
m bedeutet m(atch) Operator
/on/ teste (match), ob die Zeichenfolge on im übergebenen String vorkommt
i und prüfe das case i(nsensitive)

Da reguläre Ausdrücke sehr oft in Fhem Verwendung finden ist es immer hilfreich sich damit zu beschäftigen.

Grüße Jörg
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 20:56:31
Hallo Jörg,

ist /i nicht case insensitiv?

Gruß Otto
Titel: Antw:Syntax bei if...else
Beitrag von: JoWiemann am 30 Dezember 2018, 21:00:23
Zitat von: Otto123 am 30 Dezember 2018, 20:56:31
Hallo Jörg,

ist /i nicht case insensitiv?

Gruß Otto

Hallo Otto,

autsch. Stimmt. Kommt ja auch von i(nsensitive)

Grüße Jörg
Titel: Antw:Syntax bei if...else
Beitrag von: Otto123 am 30 Dezember 2018, 21:18:47
Noch zum Lesen:
http://perldoc.perl.org/perlre.html
und testen
https://regex101.com/

Guten Rutsch
Otto