[gelöst] Syntax bei If Abfrage in set_Exec Anweisung

Begonnen von tyrolean, 15 Oktober 2020, 14:35:50

Vorheriges Thema - Nächstes Thema

tyrolean

Hallo,

für meine Heizungssteuerung würde ich gerne folgende Fenster Offenerkennung integrieren:
Wenn ein Fenster / Tür geöffnet wird wird der PID20 Regler auf Stop gesetzt.
Nach 60 Sekunden wird geprüft ob das Fenster / Tür weiterhin offen ist, falls nein soll der PID 20 Regler wieder auf start gesetzt werden.
Nach 3600 Sekunden soll der PID 20 Regler unabhängig vom Fenster / Tür Status wieder auf Start gesetzt werden.

Gedacht hätte ich hierbei an ein DOIF welches einfach über set_exec einen Timer startet in dem die Bedingung geprüft wird - leider scheitere ich nach X Versuchen und adaptieren von Beispielcodes am Syntax. (ich bin leider was Pearl betrifft nicht besonders fit)

Hier eine Lösungsvariante der DOIF Definition, die leider nicht funktioniert:


if (["TuerSensorKueche:open"] or ["FensterSensorKueche:open"]) {                         
    fhem_set("TPWohnzimmer stop");
    set_Exec("wz_off_timer1",60, if ( ReadingsVal("FensterSensorKueche","state","0") eq "close" ) { 'fhem_set("TPWohnzimmer start")} ');
    set_Exec("wz_off_timer2",3600,'fhem_set("TPWohnzimmer start")')

}


Kann mir jemand hierfür vielleicht einen Tipp geben?

Gruß und Dank aus Tirol


Damian

Wenn du dir die Beispiele zu set_Exec in der Commandref ganau anschaust, dann wirst du feststellen, dass die Ausführung bzw. die Bedingung zur Wiederholung immer in Anführungszeichen gesetzt sind. Daher:

set_Exec("wz_off_timer1",60, 'if ( ReadingsVal("FensterSensorKueche","state","0") eq "close" ) {fhem_set("TPWohnzimmer start")} ');

hierbei wird allerdings nur einmal nach 60 Sekunden geprüft und ggf. geschaltet. Es gibt hier keine wiederholte Prüfung, sonst müsstest du noch den Parameter condition setzen, siehe Commandref.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Wolle02

Ich kann dir nur den Tip geben, bei Syntaxproblemen insbesondere bei komplexen Steuerungen das MSwitch Modul zu verwenden. Da hast du annährend eine grafische Oberfläche und "klickst dir deine Schaltung zusammen". Mag für Hardcore-Coder nicht in die Tüte kommen, aber für mich Syntax-Legasteniker sind notifys und DOIFs mittlerweile ein Graus.

tyrolean

Vielen Dank für die super schnelle und vor allem funktionierende Antwort.
Leider, oder vlt. zum Glück, habe ich abseits meines FHEM Lebens nichts mit Pearl Syntax zu tun, und es ist deshalb nicht gerade einfach für ein notify oder doif alle paar Wochen wieder herum zu probieren.

Ich traue es mich kaum zu sagen aber jetzt scheitere ich gerade an einem simplen logischen Operator, funktioniert weder mit and noch mit &&

{
if (["TuerSensorKueche:open"] or ["FensterSensorKueche:open"]) {                         
    fhem_set("TPWohnzimmer stop");
set_Exec("wz_off_timer1",60, 'if (( ReadingsVal("TuerSensorKueche","state","0") eq "close" ) && ( ReadingsVal("FensterSensorKueche","state","0") eq "close")) {fhem_set("TPWohnzimmer start")} ');
set_Exec("wz_off_timer1",3600, 'fhem_set("TPWohnzimmer start")');

}


Damian

Zitat von: tyrolean am 15 Oktober 2020, 15:16:55
Vielen Dank für die super schnelle und vor allem funktionierende Antwort.
Leider, oder vlt. zum Glück, habe ich abseits meines FHEM Lebens nichts mit Pearl Syntax zu tun, und es ist deshalb nicht gerade einfach für ein notify oder doif alle paar Wochen wieder herum zu probieren.

Ich traue es mich kaum zu sagen aber jetzt scheitere ich gerade an einem simplen logischen Operator, funktioniert weder mit and noch mit &&

{
if (["TuerSensorKueche:open"] or ["FensterSensorKueche:open"]) {                         
    fhem_set("TPWohnzimmer stop");
set_Exec("wz_off_timer1",60, 'if (( ReadingsVal("TuerSensorKueche","state","0") eq "close" ) && ( ReadingsVal("FensterSensorKueche","state","0") eq "close")) {fhem_set("TPWohnzimmer start")} ');
set_Exec("wz_off_timer1",3600, 'fhem_set("TPWohnzimmer start")');

}



Die Syntax ist ok, auch wenn paar Klammern unnötig angegeben sind. statt && kannst du in Perl auch and schreiben. Wenn es nicht funktioniert, dann schaue im Log nach, ob es Fehlermeldungen gibt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tyrolean

#5
Leider gibt es absolut keinen Eintrag im Log...

Der PID Regler wird beim Öffnen des Fensters auf stop gesetzt, jedoch funktioniert bei geschlossenem Fenster das starten nicht mehr.
Nach Ablauf der zweiten Zeit wird der PID Regler wieder normal gestartet...

tyrolean

Habs gelöst, der letzte Fehler lag darin dass ich zweimal denselben TimerName vergeben habe und somit mein erster Timer de facto sofort überschrieben wurde.
Sollte es jemanden weiterhelfen hier meine Lösung:

{
if (["TuerSensorSchlafzimmer:open"] or ["FensterSensorSchlafzimmer:open"]) {                         
    fhem_set("TPSchlafzimmer stop");
set_Exec("sz_off_timer1",60, 'if (( ReadingsVal("TuerSensorSchlafzimmer","state","0") eq "close" ) and ( ReadingsVal("FensterSensorSchlafzimmer","state","0") eq "close")) {fhem_set("TPSchlafzimmer start")} ');
set_Exec("sz_off_timer2",3600, 'fhem_set("TPSchlafzimmer start")');

}


Danke für eure Hilfe...