Device per Taster Ein- oder Auschalten

Begonnen von Dieter68, 12 Juni 2018, 15:20:40

Vorheriges Thema - Nächstes Thema

Dieter68

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



Otto123

#1
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
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

Beta-User

(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)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Dieter68

#3
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





Otto123

#4
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
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

Dieter68

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




Beta-User

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 ;)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Dieter68

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

Beta-User

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...)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Dieter68

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... :-[

Dieter68

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

Beta-User

...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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Dieter68

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.


Dieter68

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")}}

Dieter68

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