Hauptmenü

DOIF wo ist mein Fehler

Begonnen von Caleus, 20 Juni 2018, 20:13:57

Vorheriges Thema - Nächstes Thema

Caleus

Hey Leute

ich bin es mal wieder ::)

Ich habe mit dem unten stehenden Skript vor, wenn ich per TelegramBot 'Nacht' schreibe, das er erst prüft ob das Device Alle.Lichter on,off oder undefined ist, und dann je nachdem schaut, ist die Türe schon abgeschlossen, dann den jeweiligen Text samt Licht aus und/oder Türe abschließt

Folgendes Skript habe ich nun erstellt und in der Art und weise wie es zu sehen ist CODE1 klappt es auch ABER leider spuckt mir hier dann der
TelegramBot nicht nur 1 Nachricht aus, sondern schickt mir gleich 7 oder 8 Nachrichten (siehe Screenshot)

CODE1
HomeBot:msgText.* {
if([HomeBot:msgText] eq 'Nacht') {
       if (([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set NUKIDevicexxxxxxxxx lock");;
                        fhem("set HomeBot send Die Lichter sind schon aus, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set HomeBot send Die Lichter sind schon aus und die Tür war schon abgeschlossen.");;
       }
       elsif (([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set NUKIDevicexxxxxxxxx lock");;
                        fhem("set HomeBot send Die Lichter sind jetzt aus, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set HomeBot send Die Lichter sind jetzt aus und die Tür war schon abgeschlossen.");;
       }
       elsif (([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set NUKIDevicexxxxxxxxx lock");;
                        fhem("set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war schon abgeschlossen.");;
       }
    }
else{

}
}


Ich habe natürlich schon IF und DOIF versucht, da klappt es aber dann gar nicht  nur wie oben zu sehen ist bekomme ich eine Antwort per TelegramBot

Vieleicht sehe ich ja den Wald vor lauter Bäumen nicht ;D

Caleus

Otto123

#1
Hi,

diese Konstruktion ist wirkungslos:
if([HomeBot:msgText] eq 'Nacht') die Abfrage der Werte mit [Gerät:Reading] gilt in DOIF und IF aber nicht in Perl. Das betrifft alle Deine Vergleiche!

ReadingsVal("HomeBot","msgText","") wäre Dein Freund.

Das erste if kannst Du in den Trigger integrieren -> HomeBot:msgText.Nacht  das solltest DU aber im Eventmonitor verifizieren.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

Danke Otto123  für die schnlle antwort.

Habe es nun so gemacht:


HomeBot:msgText.* {     
if (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set NUKIDevicexxxxxxxxxlock");;
                        fhem("set HomeBot send Die Lichter sind schon aus, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set HomeBot send Die Lichter sind schon aus und die Tür war schon abgeschlossen. \n Jarvis");;
       }
       elsif (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set NUKIDevicexxxxxxxxxlock");;
                        fhem("set HomeBot send Die Lichter sind jetzt aus, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set HomeBot send Die Lichter sind jetzt aus und die Tür war schon abgeschlossen. \n Jarvis");;
       }
       elsif (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set NUKIDevicexxxxxxxxxlock");;
                        fhem("set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war noch auf, habe sie nun abgeschlossen.");;
       }
       elsif (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'locked')){
                        fhem("set Alle.Lichter off");;
                        fhem("set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war schon abgeschlossen.");;
       }
   }


leider schickt mir der TelegramBot dann immer noch 4 Nachrichten obwohl es nur 1 seien sollte. Siehe Screenshot

ich habe event-on-change-reading .* gesetzt

Caleus

Otto123

#3
Du hast mich gar nicht verstanden?  :o

BTW auch Dein Betreff ist irreführend dort redest Du vom DOIF - Dein Code ist aber ein notify und dahinter so etwas wie Perl!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

oh sorry also ich bin da wohl zu erschöpft für tut mir wirklich leid.  :-[

also
my $wert = ReadingsVal("HomeBot","msgText","");
kenne ich, aber wie bringt mir das nun was?

Caleus

Otto123

sorry mir ist es auch zu warm, ich habe keine Lust Deinen verkorksten Code neu zu schreiben  :o
Als DOIF Code könnte das gehen

(([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked'))(set NUKIDevicexxxxxxxxxlock)(set HomeBot send Die Lichter sind schon aus, die Tür war noch auf, habe sie nun abgeschlossen.)
DOELSIF (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'off') and ([NUKIDevicexxxxxxxxx:state] eq 'locked'))(set HomeBot send Die Lichter sind schon aus und die Tür war schon abgeschlossen. \n Jarvis)
DOELSEIF(([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked'))(set Alle.Lichter off)(set NUKIDevicexxxxxxxxxlock)(set HomeBot send Die Lichter sind jetzt aus, die Tür war noch auf, habe sie nun abgeschlossen.)
DOELSEIF (([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'on') and ([NUKIDevicexxxxxxxxx:state] eq 'locked'))(set Alle.Lichter off)(set HomeBot send Die Lichter sind jetzt aus und die Tür war schon abgeschlossen. \n Jarvis)
DOELSEIF(([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'unlocked'))(set Alle.Lichter off)(set NUKIDevicexxxxxxxxxlock)(set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war noch auf, habe sie nun abgeschlossen.)
DOELSEIF(([HomeBot:msgText] eq 'Nacht') and ([Alle.Lichter:state] eq 'undefined') and ([NUKIDevicexxxxxxxxx:state] eq 'locked'))(set Alle.Lichter off)(set HomeBot send Der status der Lichter ist unbekannt habe aber den OFF befehl gesendet, die Tür war schon abgeschlossen.)


Als notify geht es vielleicht ähnlich mit IF()()ELSEIF()()

was Du bisher geschrieben ist Perl und da musst Du mit ReadingsVal arbeiten. Dein Code sollte jede Menge Fehler werfen?!?

Probiere doch am Besten erstmal eine einfache Bedingung, eine Zeile, wenn die geht machst Du weiter.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

Lieber Otto123

Sollte Ich oder einer meiner Texte dich beleidigt oder Verärgert haben so tut es mir leid und war nicht gewollt.

Mein letzter Post war nur ein Hinweis das ich zwar gesehen habe das du dir die Mühe gemacht hast mir zu antworten ich aber es nicht verstanden haben auf Grund meiner Müdigkeit.

Caleus

Otto123

nein keine Sorge, bin nicht beleidigt - schau es Dir in Ruhe nochmal an, versuch es zu verstehen und dann probiere weiter.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#8
Ich habe mal noch ein Testumfeld gebaut, da kannst Du etwas nachvollziehen.
Die beiden notify und das DOIF habe ich im Eventmonitor erzeugen lassen, jeweils aus dem Event
2018-06-20 23:24:03 dummy Test Text: Nacht
2018-06-20 23:24:46 dummy Test Text: Tag
2018-06-20 23:25:28 dummy Test on

Und dann einfach den Code im DEF Editor angepasst
defmod Test dummy
attr Test readingList Text Temperatur automatic
attr Test room Test
attr Test setList on off Text Temperatur automatic

defmod Test_notify_1 notify Test:Text:.Nacht {my $a = ReadingsVal("Test","automatic","");; if ($a eq "on"){fhem("set Test Temperatur 15")}}
attr Test_notify_1 room Test

defmod Test_notify_2 notify Test:o.* IF ([Test:state] eq "on")(set Test automatic on) ELSE (IF ([Test:state] eq "off")(set Test automatic off))
attr Test_notify_2 room Test

defmod Test_DOIF_1 DOIF ([Test:"^Text:.Tag$"] and [?Test:automatic] eq "on") (set Test Temperatur 21)
attr Test_DOIF_1 room Test



Ich hoffe das hilft beim Verständnis welche Varianten zur Lösung einer Aufgabe eingesetzt werden können:
notify mit Perl if oder
notify mit FHEM IF oder
DOIF

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

Ich danke dir, nach einer erholsamen Nacht und einem turbulenten Tag, habe ich es mir angeschaut und mich für

defmod Test_notify_1 notify Test:Text:.Nacht {my $a = ReadingsVal("Test","automatic","");; if ($a eq "on"){fhem("set Test Temperatur 15")}}
attr Test_notify_1 room Test


entschieden und der erste test


HomeBot:msgText:.Nacht {
my $a = ReadingsVal("HomeBot","msgText","");
my $b = ReadingsVal("Alle.Lichter","state","");
if ($a eq "Nacht" and $b eq "undefined"){fhem("set HomeBot send bett funktioniert. \n Jarvis")}
else {fhem("set HomeBot send Else ist eingetretten. \n Jarvis")}}


hat auch schon mal geklappt. Ich hoffe man nutzt hier if und nicht IF.

Caleus

Otto123

Hi Caleus,

in dem Moment: zwischen  {} geht nur if :)
Wer ist jetzt man? ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

Also wegen dem if bzw IF das habe ich hier im Forum gelesen das es ja einen Unterschied gibt ich glaube es bezog sich auf Perl if und Fhem if und da wurde dann unterschieden zwischen if und IF kann aber sein das ich da was verwechsel.

Aber der Test mit dem Else hat genau wie erwartet funktioniert. Aber ich möchte ja lehrnen, also nutze ich nur if bzw elsif richtig?

Caleus

Otto123

Moin,

na ich hatte es doch eindeutig dazu geschrieben:
Meine Beispiele in der Reihenfolge:
Zitatnotify mit Perl if oder
notify mit FHEM IF oder
DOIF
Du hast Dich jetzt für Perl if entschieden.
In dem Moment wo Du im notify Ausführungsteil hinter dieser Klammer bist { - ist es Perl Code. Deswegen geht auch dort bloß der Zugriff auf Readings mit ReadingsVal()

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Caleus

Otto123 ich danke Dir, auch wenn ich mich anfangs schwergetan habe, ich es nun denke ich verstanden, und auch schon umgesetzt, und was soll ich sagen es läuft genau wie ich es mir vorgestellt habe.

Caleus