Hallo,
das mein ein Device über den Befehl "set" in den Zustand on oder off setzen kann ist mir klar. Gibt es auch die Möglichkeit das Device egal in welchem Zustand es ist einfach umzuschalten also toggle?
Hintergrund ist das ich an mehreren ESP8266 jeweils eine Taste habe mit denen ich eine einzige Schaltsteckdose umschalten möchte.
Eine andere Möglichkeit wäre ja wenn ich zu jeder Taste ein notify erstelle das dann bei Aktivierung den jeweiligen Zustand der Schaltsteckdose ausliest und dann je nach vorgefundenem Zustand den Befehl "on" oder "off" sendet.
Diese Lösung wäre für mich die einfachste Lösung.
Leider bekomme ich diese if-Abfrage im notify nicht hin. :-\
Es wäre klasse wenn Ihr mir da helfen könntet.
Gruß
Dieter68
Hallo Dieter68,
Allgemein
Geräte mit setExtensions können den Befehl toggle.
Fall ESP
Der kann eigentlich über interne Rules toggeln.
https://wiki.fhem.de/wiki/Sonoff#Device_Taster
Zu Deiner Frage nach dem notify solltest Du deinen Codeansatz liefern, dann können wir überlegen was falsch ist.
Das ist jetzt keine fertige Lösung, nur ein Ansatz :) viele Wege ...
Gruß Otto
(Wieder mal überschneidendes Schreiben, daher teilweise doppelt :D )
(rules passen wohl eher nicht, es scheinen mehrere ESP's zu sein und ein ganz anderes zu schaltendes Device, dachte ich jedenfalls nach mehrmaligem Lesen)
Glaskugelreib:
- Wenn das Device mit der Schaltsteckdose die "set-extensions" unterstützt, geht evtl. ein "toggle"- Wenn nicht, geht evtl. sowas (halt mit notify statt at und Abfrage auf den Status der Schaltsteckdose):https://wiki.fhem.de/wiki/If-condition#if-else-Bedingung
- Du brauchst auch nicht zu jeder Taste ein notify, man kann das bündeln, nutze dazu am einfachsten den Event-Monitor (siehe wiki-Seite dazu). Achte ggf. darauf, dass du nicht immer doppelt triggerst (Taste drücken = ein Event, Taste loslassen auch => Licht geht sofort wieder aus, wenn nicht nur auf "Loslassen" reagiert wird ;) )
=> mehr Info bitte, wenn die obigen Hinweise nicht ausreichen sollten...
(mindestens: ein list von dem device; wenn die Taster ein extra-device ist, auch von mind. einem der Taster)
Hallo Ihr Beiden,
danke erst mal für die Antworten.
Da ich Anfänger bin versuche ich die "Probleme" nicht einfach irgendwie zu lösen sondern versuche über verschiedene Wege das Ziel zu erreichen und dabei auch mit der für mich nicht einfachen Syntax in FHEM/Perl klar zu kommen.
@Otto
Sicher wäre es eine Lösung eine Toggle-Funktion in den ESP zu bauen und den Befehl einfach aus FHEM per Webcmd an den Chip zu senden.
Da wäre die eigentliche Umschaltfunktion klar in den Chip verlagert und FHEM gibt nur einen Befehl ohne eine eigene Prüfung in welchem Zustand das Device steht weiter.
Meine erste Frage ist somit beantwortet das man nicht jedes Device grundsätzlich per toggle-Befehl umschalten kann.
Jetzt gibt es ja zwei grundsätzliche Wege - einmal per notify und dann sollte es auch über DOIF gehen.
Soweit ich gelesen habe ist das ja teilweise eine Glaubensfrage über welchen Weg man geht.
Ich habe mich also für ein "dummes" Device entschieden was keinen toggle-Befehl versteht und wollte über notify ein Umschalten erreichen.
Meinen Taster habe ich per ESP8266 an FHEM anliegen und der schaltet auch schön per Taster zwischen on/off
@Beta-User
Ja mit dem doppelt Triggern wäre nicht so klasse :D dazu wollte ich nur den Zustand on vom Taster im notify verwenden.
Geht der Taster auf on soll halt per if elsif das Device abgefragt werden und dann je nach Schaltzustand on oder off gesendet werden.
Ich lese mir jetzt mal die von Euch genannten Hinweise genauer durch und versuche das mal zusammen zu basteln.
Ach ja versucht hatte ich es so.
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:on { if (Value(ESPEasy_Schaltsteckdose2_PUMP ) eq "on" { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on"}}
Gruß
Dieter68
Hallo Dieter68,
setExtensions ist bei einigen Geräten konfigurierbar schau dazu einfach in die commandref.
Mir fehlt derzeit etwas die Vorstellung von Deinem "dummen" Device :)
Etwas aus meiner Testkiste.
defmod T_nty_Aktor notify T_Aktor[1,2]:on|off|tilted {if((Value("T_Aktor1") eq "on") && (Value("T_Aktor2") eq "on")) {fhem "set T_Lampe1 on"} else {fhem "set T_Lampe1 off"}}
attr T_nty_Aktor room Test
defmod T_Aktor1 dummy
attr T_Aktor1 webCmd on:off
attr T_Aktor1 room Test
defmod T_Aktor2 dummy
attr T_Aktor2 webCmd on:off
attr T_Aktor2 room Test
defmod T_Lampe1 dummy
attr T_Lampe1 room Test
https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Gruß Otto
Hallo Otto123,
ich glaube ich stehe voll auf dem Schlauch - was meinst Du mit dummy-Device?
Muss ich für die Aufgabe ein extra dummy erstellen um das so zu schalten wie ich mir das vorstelle?
Mein Schalter ist das reale Device "ESPEasy_ESP_Easy_Ersatz1_Schalter" was eben in dem Reading "Schalter" on oder off stehen hat je nach Tasterstellung. Getestet funktioniert
Das Device " ESPEasy_Schaltsteckdose2_PUMP" kann man einfach per set Befehl auf on oder off schalten. Habe ich auch getestet und funktioniert.
Wenn ich doch jetzt ein notify auf "ESPEasy_ESP_Easy_Ersatz1_Schalter:on" anlege sollte das doch bei on ausgelöst werden oder sehe ich das falsch?
Darin wollte ich eben eine IF / ELSE Abfrage integrieren.
Gruß
Dieter
Zitat von: Dieter68 am 12 Juni 2018, 16:01:25
Ach ja versucht hatte ich es so.
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:on { if (Value(ESPEasy_Schaltsteckdose2_PUMP ) eq "on" { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on"}}
Sieht doch fast gut aus, versuch's mal mit: ...Value("ESPEasy_Schaltsteckdose2_PUMP")
Man kann übrigens recht einfach prüfen, ob die Einzelteile funktionieren, indem man sie oben in die Kommandozeile eingibt. Teste doch mal beide Varianten:
{Value(ESPEasy_Schaltsteckdose2_PUMP)}{Value("ESPEasy_Schaltsteckdose2_PUMP")}
Anschließend dann den Ausführungsteil deines notify ;)
Danke für den Hinweis mit der Kommandozeile.
So kann man wirklich schön testen.
Ok {Value("ESPEasy_Schaltsteckdose2_PUMP")} bringt jetzt auch den Zustand des Devices.
Wenn ich jetzt folgendes eingebe:
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:on { if (Value("ESPEasy_Schaltsteckdose2_PUMP") eq "on" { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on"}}
Bekomme ich folgende Syntax-Fehlermeldung
syntax error at (eval 727140) line 1, near ""on" { "
syntax error at (eval 727140) line 1, near "}}"
Irgendwie mag mich FHEM nicht :-\
Gruß
Dieter
Es fehlt die schließende Klammer für die if-Bedingung.
Und es ist Perl, nicht FHEM, mit dem du kämpfst.
Aber schön, wenn du weiterkommst - einmal verstanden, wie es geht, wird das immer einfacher ;) . (OK, irgendwann ist dann Ende mit einfacher werden...)
Dein Wort in Gottes Ohren....
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:on { if (Value("ESPEasy_Schaltsteckdose2_PUMP") eq "on") { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on"}}
Klappt aber immer noch nicht - jetzt die Fehlermeldung syntax error at (eval 730297) line 1, at EOF
Ich glaube ich gebe auf... :-[
So nimmt FHEM das ganze an:
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:on { if (Value("ESPEasy_Schaltsteckdose2_PUMP") eq "on") { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on")}}
Aber es passiert nichts wenn ich den Taster drücke..... >:(
Gruß
Dieter
...dann schau mal in den Event-Monitor. Vermutlich ist der Event etwas anders, nämlich mit einem Leerzeichen vor dem "on":
ESPEasy_ESP_Easy_Ersatz1_Schalter:.on
Hier mal ein Auszug aus dem Event-Monitor
Events (Filter: ESPEasy_ESP_Easy_Ersatz1_Schalter) FHEM log ResetCreate/Modify Device
2018-06-12 17:25:16 ESPEasy ESPEasy_ESP_Easy_Ersatz1_Schalter Schalter: on
2018-06-12 17:25:16 ESPEasy ESPEasy_ESP_Easy_Ersatz1_Schalter Sch: on
2018-06-12 17:25:17 ESPEasy ESPEasy_ESP_Easy_Ersatz1_Schalter Schalter: off
2018-06-12 17:25:17 ESPEasy ESPEasy_ESP_Easy_Ersatz1_Schalter Sch: off
Ich kriege da noch graue Haare.
Deinen Vorschlag hatte ich so eingegeben:
define toggle.Schaltsteckdose notify ESPEasy_ESP_Easy_Ersatz1_Schalter:.on { if (Value("ESPEasy_Schaltsteckdose2_PUMP") eq "on") { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on")}}
Jetzt habe ich mal folgendes getestet:
Eingabe von
{Value("ESPEasy_ESP_Easy_Ersatz1_Schalter")}
ergibt als Inhalt
Sch: off
Somit steht da ja nicht sauber "on" oder "off" in der Variablen - so kann notify doch nicht auslösen oder sehe ich das falsch?
Gruß
Dieter
falls du nicht an dem notify festhalten willst , ..wobei es sicher prima ist , um dazuzulernen ..., kannst du es mit MSwitch probieren , da kannst du bei bedarf jedes Device togglen.
https://wiki.fhem.de/wiki/MSwitch.pm#MSwitch_Extensions_.280:1.29 (https://wiki.fhem.de/wiki/MSwitch.pm#MSwitch_Extensions_.280:1.29)
Aber auch da müsstest du dich wohl reinarbeiten .
gruss Byte09
Zitat von: Dieter68 am 12 Juni 2018, 16:28:50
Hallo Otto123,
ich glaube ich stehe voll auf dem Schlauch - was meinst Du mit dummy-Device?
Muss ich für die Aufgabe ein extra dummy erstellen um das so zu schalten wie ich mir das vorstelle?
Hallo Dieter,
deine Änderung im Post: versucht hatte ich ... Habe ich nicht gesehen. Und damit bis dato nicht gewusst was Du wirklich hast: ESP Schalter, Taster, Aktor, alles in Einem oder in mehreren Geräten.
Mein Beispiel mit den dummy's war einfach was zum üben zu genau Deiner ersten Frage:
Zitat von: Dieter68 am 12 Juni 2018, 15:20:40
Hintergrund ist das ich an mehreren ESP8266 jeweils eine Taste habe mit denen ich eine einzige Schaltsteckdose umschalten möchte.
Eine andere Möglichkeit wäre ja wenn ich zu jeder Taste ein notify erstelle das dann bei Aktivierung den jeweiligen Zustand der Schaltsteckdose ausliest und dann je nach vorgefundenem Zustand den Befehl "on" oder "off" sendet.
Diese Lösung wäre für mich die einfachste Lösung.
Leider bekomme ich diese if-Abfrage im notify nicht hin. :-\
Aber jetzt seit ihr ja schon weiter :)
Gruß Otto
[OT]
@Byte09:Nachdem ich schon DOIF nicht verstanden habe, werde ich niemanden dahingehend beraten ein Toolset zu nutzen, das "irgendwas" (im Sinne von allem möglichem) voll automatisch macht. M.E. ist es mindestens erforderlich, dass der jeweilige User zuvor schon verstanden hat, was ein Event ist und wie darauf reagiert werden kann.Es sollte ihm im mindesten Fall klar sein, wie etwas Perl funktioniert, was ja auch bei MSwitch im Hintergrund genutzt wird.
Wenn jemand diese Kenntnisse hat, mag er anschließend machen, was er will...
[/OT]
@Dieter:Nutze den Event-Monitor und schau mal nach, ob du nicht besser ReadingsVal() nutzt. Schau dir dazu ein list von deinem ESPEasy_ESP_Easy_Ersatz1_Schalter an.
Zitat von: Beta-User am 12 Juni 2018, 17:52:55
[OT]
@Byte09:Nachdem ich schon DOIF nicht verstanden habe, werde ich niemanden dahingehend beraten ein Toolset zu nutzen, das "irgendwas" (im Sinne von allem möglichem) voll automatisch macht. M.E. ist es mindestens erforderlich, dass der jeweilige User zuvor schon verstanden hat, was ein Event ist und wie darauf reagiert werden kann.Es sollte ihm im mindesten Fall klar sein, wie etwas Perl funktioniert, was ja auch bei MSwitch im Hintergrund genutzt wird.
Wenn jemand diese Kenntnisse hat, mag er anschließend machen, was er will...
[/OT]
... das sehe ich etwas anders, sei aber mal dahingestellt wegen OT .
gruss Byte09
[OT]
@Byte09
Zu meiner Anmerkung vorher ergänzend noch: Hut ab! Scheint wirklich einige user zu geben, die das gerne nutzen. Hätte bei Ankündigung des Tools nicht geglaubt, dass das so gut ankommt! Und auch dein Support ist vorbildlich.
Der Rest ist Ansichtssache, über die man lange diskutieren kann :) .
[/OT]
Zitat von: Beta-User am 12 Juni 2018, 18:05:15
[OT]
@Byte09
Zu meiner Anmerkung vorher ergänzend noch: Hut ab! Scheint wirklich einige user zu geben, die das gerne nutzen. Hätte bei Ankündigung des Tools nicht geglaubt, dass das so gut ankommt! Und auch dein Support ist vorbildlich.
Der Rest ist Ansichtssache, über die man lange diskutieren kann :) .
[/OT]
thx ;) - und nun schluss mit OT
gruss Byte09
Ich kann aber doch kein notify-Trigger mit einem readingsVal() definieren?
Klar in der If-Abfrage wäre das möglich aber das notify muss doch erst mal auf einen passenden Zustand starten?
@Otto123
Ich habe zum Testen einen ESP8266 der nur den Zustand des Taster zum FHEM Server sendet.
Die Schaltsteckdose ist ein eigene Einheit in Form einer Sonoff-Schaltsteckdose.
Nachher sollen mehrere Taster an verschiedenen ESP-Bausteinen (die ich schon in Betrieb habe) eben diese eine Schaltsteckdose unabhängig schalten können.
Gruß
Dieter
Ich habe mal mein notify und die darin enthaltenen Anweisungen mit trigger ausprobiert.
Das notify läuft und auch die Anweisungen (schalten der Steckdose ein und aus) funktioniert problemlos.
Es liegt also einfach an dem <REGEXP> im notify.
Es erwartet den Status "on" bekommt aber von meinem ESP den Status "Sch: on" - klar das es nicht anspricht.
Aber wie löse ich das Problem ?
Gruß
Dieter
So - ich habe es am laufen.....
ESPEasy_ESP_Easy_Ersatz1_Schalter:Sch:.on { if (Value("ESPEasy_Schaltsteckdose2_PUMP") eq "on") { fhem("set ESPEasy_Schaltsteckdose2_PUMP off") } else { fhem("set ESPEasy_Schaltsteckdose2_PUMP on")}}
Danke Euch für die klasse Hilfe.
Ich werde jetzt mal erst einige Bücher zu Perl lesen und hoffe ich werde auch mal so gut hier in dem Thema wie Ihr.
So dann schöne Grüße
Dieter
Oder probiere etwas praktisches mit Dummies :)
So mach ich das immer
Mein Beispiel mit den Dummies entspricht exakt Deiner Lösung, abgesehen von den zusätzlichen Triggern und der && Verknüpfung in der Abfrage :)
Zum Lesen und suchen -> http://perldoc.perl.org/index.html
Gruß Otto
Hallo Otto123,
Du steckst da so in der Materie das Du mit einem Blick bei solchen Listings erkennen kannst was da abläuft oder wie der Weg ist.
Leider bin ich da noch lange nicht angekommen. Darum habe ich wohl bei Deinem Vorschlag auch nicht direkt den Weg gesehen um damit mein Problem schneller zu lösen.
Selbst bei einigen Grundlagen habe ich noch nicht so den aha-Moment gehabt den man braucht.
Es ist ja auch nicht ganz einfach wenn es mehrere Wege gibt und man erst einmal sehen muss welcher Weg für einen selber passend ist.
Sicher kann man mit Dummys auch schön üben aber ich komme eigentlich aus der Elektronik und habe mehr Spaß die Hardware zu bauen.
Da geht bei mir der Weg dann immer erst über die Hardware und danach mache ich mir Gedanken wie ich FHEM beibringe damit arbeiten zu können. :)
Aber wenn man dann mal Erfolg mit einer Sache hat macht die ganze Nummer auch wieder Spaß.
Aber ich brauche eben mehr Wissen im Bereich von Perl und da lese ich die angebotenen Seiten.
Danke nochmal und einen schönen Abend.
Dieter