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?
Hi,
stimmt denn das Reading?
Zitat(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme" ...
Gruß Otto
Ja, das Reading stimmt so, es hat zweimal den gleichen Namen.
Dann zeig mal bitte ein list Umwaelzpumpe_Therme
Nach dem selben Schema sende ich ohne Probleme weitere Variablen, allerdings alles Zahlenwerte.
Dies ist der erste String.
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
Du sendest eine Zahl :-X Du fragst einen String ab ;)
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.
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") }}
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.
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" )}
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
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"}}
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.
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"
Hast Du das aus meiner Antwort #12 mal getestet?
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.
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.
if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme","") =~ m/on/i ) {"wahr"}else{"falsch"}}
Unknown command if(ReadingsVal("Umwaelzpumpe_Therme","Umwaelzpumpe_Therme",""), try help.
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.
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!
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!!!!!!!!!
habe #17 editiert :)
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
Hallo Jörg,
ist /i nicht case insensitiv?
Gruß Otto
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
Noch zum Lesen:
http://perldoc.perl.org/perlre.html
und testen
https://regex101.com/
Guten Rutsch
Otto