Problem mit einer If Abrage in DOIF, mit Aufruf einer SUB in 99_MyUtils

Begonnen von Rewe2000, 23 Dezember 2017, 16:04:34

Vorheriges Thema - Nächstes Thema

Rewe2000

Hallo,

teste und lese das Forum nun schon Tagelang, jetzt brauch ich mal eure Hilfe.

Hier mein Vorhaben in Kurzform:
Ich bin dabei mir über ein DOIF Device, eine Warnung mit Telefonansage bei geöffneten Fenstern zu "stricken". Über das DOIF lasse ich mir ein AT-Device erzeugen, bei welchem ich alle 5 Minuten die Zeit über das DOIF (mit repeadcmd) nachtriggere. Die Warnzeiten sollen bei sich änernder Außentemperatur entsprechend verlängert oder verkürzt werden. Zur Berechnung dieser Zeiten verwende ich ein SUB in der 99_MyUtil. Das alles läuft eigentlich für mich zufriedenstellend.

Ich wollte nun mein DOIF umstellen und eine weitere if Abfrage einfügen, welche einen Fhem Befehl mit einem SUB Aufruf enthält, doch das gelingt mir nicht. Entweder ist das so nicht möglich oder ich mache da noch Fehler mit der Klammerung etc.

Folgende If Abfrage will ich einbauen:
(
......
{if ([$SELF:STOPP_AT] == 1)
{fhem("defmod at_Bad_Kaeltewarnung at +{(Offenzeit("Bad_Kaeltewarnung"))} set TelefonClient call **52 30 !Kältewarnung. *-2 &300,5")}
.....
}


Die SUB Funktion gibt eine Zeit in der Form: hh:mm:ss zurück, mit welcher das AT-Device versorgt wird. Das AT-Device wird nicht angelegt, da es die SUB Funktion nicht korrekt erkennen kann. Schreibe ich nach dem +00:10:00 (ohne die SUB Funktion) wird das If Fehlerfrei ausgeführt.

Folgende Fehlermeldung wird ausgegeben:
2017.12.23 15:11:25 1: Test +
2017.12.23 15:11:25 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 1102395) line 1.
2017.12.23 15:11:25 1: PERL WARNING: Use of uninitialized value in anonymous hash ({}) at (eval 1102395) line 1.


Gebe ich den Befehlsstring in die Fhem Eingabezeile ein, wird das AT-Device (mit der berechneten SUB-Zeit) korrekt angelegt:
defmod at_Bad_Kaeltewarnung at +{(Offenzeit("Bad_Kaeltewarnung"))} set TelefonClient call **52 30 !Kältewarnung. *-2 &300,5

Ich wollte euch mit dem kompletten Code nicht zumüllen, sollte dieser für die Problemlösung notwendig sein, so stelle ich diesen hier gerne ein. Ich bin mir auch sicher, es gäbe da noch besserer Lösungen mit dem DOIF alleine, aber dazu muss ich dieses mächtige Device noch ein wenig mehr kennenlernen.

Danke für eure Hilfe
Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Ellert

Auf der Perl-Ebene muss die DOIF-Syntax in Anführungszeichen eingeschlossen werden.

nicht so [$SELF:STOPP_AT] sondern so "[$SELF:STOPP_AT]"

Rewe2000

Danke Ellert für die schnelle Hilfe,

das scheint es aber nicht zu sein. Bei mir wird das AT-Device mit beiden If Abfragen korrekt angelegt (ohne und mit ""), wenn ich nur den Aufruf der SUB Funktion vermeide. Werde aber zukünftig die "" verwenden.

Folgende If Abfrage klappt:
.....
({if ("[$SELF:STOPP_AT]" == 1)
{fhem("defmod at_Bad_Kaeltewarnung at +00:10:00 set TelefonClient call **52 30 !Kältewarnung. *-2 &300,5")}
}....


Verwende ich aber wieder meine SUB Fuktion im Fhem Befehl, welche die Zeitangabe (hh:mm:ss) liefern soll, so gibt es wieder eine Fehlermeldung:
....
({if ("[$SELF:STOPP_AT]" == 1)
{fhem("defmod at_Bad_Kaeltewarnung at +{(Offenzeit("Bad_Kaeltewarnung"))} set TelefonClient call **52 30 !Kältewarnung. *-2 &300,5")}
}
....


Kann ich denn überhaupt im DOIF, innerhalb eines Fhem Befehls noch eine SUB Funktion aufrufen?
Wenn ja, prüfe doch bitte mal meine Klammerung (), {}, etc. ob das so passen sollte. Ich habe auch den Fhem Befehlsteil schon aufgetrennt und versucht mit . wieder zusammenzusetzen, klappt aber genau so wenig.

Irgendwo im Fhem Befehl, innerhalb der If Abfrage muss bei mir "der Hund begraben sein".

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Ellert

Dann versuche mal die inneren geschweiften Klammern zu escapen und was sonst noch interpretiert wird oder einfache ' statt "

{fhem('defmod at_Bad_Kaeltewarnung at +{(Offenzeit("Bad_Kaeltewarnung"))} set TelefonClient call **52 30 !Kältewarnung. *-2 &300,5')}

Rewe2000

Danke Ellert,

ich denke dies war die Lösung, mit '' anstelle von "" wird das AT-Device nun angelegt, so wie ich mir das vorgestellt habe.

Eines jedoch ist mir aufgefallen, unter TIMESPEC steht keine Zeit in Form von HH:MM:SS sondern der Befehl meiner Funktion {(Offenzeit("Bad_Kaeltewarnung"))} aber so wie es aussieht läuft das AT-Device korrekt.

So ziemlich alles habe ich versucht, nur auf die '' bin ich nicht gekommen.
Ich denke bis ich 50% vom DOIF verstanden habe, werden noch einige Tage vergehen. ;)

Vielen Dank dir für deine Hilfe.
Schöne Weihnachten und einen guten Rutsch nach 2018.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Damian

Zitat von: Rewe2000 am 23 Dezember 2017, 18:37:37

Ich denke bis ich 50% vom DOIF verstanden habe, werden noch einige Tage vergehen. ;)


Und wenn du die restlichen 50 % verstanden hast, wirst du vermutlich ohne at-Befehle auskommen ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 23 Dezember 2017, 20:27:03
Und wenn du die restlichen 50 % verstanden hast, wirst du vermutlich ohne at-Befehle auskommen
Und ohne Perl + 99_myUtils. Zumindest in diesem Fall.

Ich glaube, ich habe gar keine 99_myUtils mehr. Höchstens noch als "Leiche" ;). Muss ich heute abend glatt man nachschauen...