Rolladensteuerung externer Taster notify

Begonnen von Hannibal1990, 31 August 2017, 19:09:30

Vorheriges Thema - Nächstes Thema

Hannibal1990

Hi zusammen,

habe bei meinem FHEM angefangen mit notify zu automatisieren und wollte nun das Rollomodul verwenden.
https://wiki.fhem.de/wiki/ROLLO
Da in Wiki die Beschreibung mit der Verwendung mit einem externen Taster in DOIF angegeben ist
wollte ich fragen ob mir jemand helfen könnte von DOIF in notify umzuwandeln?
Ich bekomme es irgendwie nicht hin  :-[

Hier die DOIF Anweisung

define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq "on" and [meinRolloModul] ne "drive-up") (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq "off" and [meinRolloModul] eq "drive-up") (set meinRolloModul extern stop)
define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq "on" and [meinRolloModul] ne "drive-down") (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq "off" and [meinRolloModul] eq "drive-down") (set meinRolloModul extern stop)


igami

Zitat von: Hannibal1990 am 31 August 2017, 19:09:30
Da in Wiki die Beschreibung mit der Verwendung mit einem externen Taster in DOIF angegeben ist
wollte ich fragen ob mir jemand helfen könnte von DOIF in notify umzuwandeln?
Warum möchtest du das denn tun? Wenn es für dich einfacher wäre würdest du ja nicht fragen ;)
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Hannibal1990

Weil ich alles in notify machen wollte.
Sonst habe ich so ein Durcheinander.
Aber wenn es nicht so einfach ist dann hilft es nix.

Frank_Huber

Verstehe den Hintergrund zwar nicht, aber wenn Du alles in einem haben möchtest, dann schiebe alles in DOIF.

Gesendet von meinem S3_32 mit Tapatalk


Beta-User

Ungetested und noch unvollständig, dafür ein notify statt 2 DOIF ("alles in einem"):
define n_Rolladen_Manuell notify meinRollo_Kanal(1|2) {
if ($NAME eq "meinRollo_Kanal1" ) {
  if (ReadingsVal("meinRolloModul","state","undef") ne "drive-up" && $EVENT == "on") { fhem "set meinRolloModul extern open"}
  elsif {(ReadingsVal("meinRolloModul","state","undef") eq "drive-up" && $EVENT == "off") { fhem "set meinRolloModul extern stop"}
}
else {
  #code für Kanal 2 analog
}
}


Dabei bin ich davon ausgegangen, dass [meinRolloModul] eigentlich eine nicht-triggernd Angabe ist. Wenn das der Fall ist: Geht auch, der Code müßte dann aber mehr prüfen, was besser in eine eigene MyUtils-Funktion auszulagern wäre.

Gruß, Beta-User
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

Frank_Huber

Der Vollständigkeit halber hier EIN DOIF einer meiner Rollos. Zwei Taster auf einen Rollo, ein DOIF.
funktioniert seit Monaten problemlos.

defmod Rollo_Bad_EG DOIF ([GPIO_IN_06:"^on$"] and [?Rollo2_Bad_EG] ne "drive-up") (set Rollo2_Bad_EG offen)\
DOELSEIF ([GPIO_IN_07:"^on$"] and [?Rollo2_Bad_EG] ne "drive-down") (set Rollo2_Bad_EG geschlossen)\
DOELSEIF (([GPIO_IN_06:"^on$"] or [GPIO_IN_07:"^on$"]) and [?Rollo2_Bad_EG] =~ "drive-down|drive-up") (set Rollo2_Bad_EG stop)
attr Rollo_Bad_EG cmdpause 1:1:1
attr Rollo_Bad_EG do always

Hannibal1990

Zitat von: Beta-User am 01 September 2017, 11:20:40
Ungetested und noch unvollständig, dafür ein notify statt 2 DOIF ("alles in einem"):
define n_Rolladen_Manuell notify meinRollo_Kanal(1|2) {
if ($NAME eq "meinRollo_Kanal1" ) {
  if (ReadingsVal("meinRolloModul","state","undef") ne "drive-up" && $EVENT == "on") { fhem "set meinRolloModul extern open"}
  elsif {(ReadingsVal("meinRolloModul","state","undef") eq "drive-up" && $EVENT == "off") { fhem "set meinRolloModul extern stop"}
}
else {
  #code für Kanal 2 analog
}
}


Dabei bin ich davon ausgegangen, dass [meinRolloModul] eigentlich eine nicht-triggernd Angabe ist. Wenn das der Fall ist: Geht auch, der Code müßte dann aber mehr prüfen, was besser in eine eigene MyUtils-Funktion auszulagern wäre.

Gruß, Beta-User

Danke dir für die Umwandlung und auch danke für die anderen Vorschläge  ;)

Habe jetzt mit meinen Variablen angepasst, doch leider fährt der Status vom Modul nicht bei betätigen vom externen Taster

define n_Rolladen_links_Kind_3_Manuell notify Rolladen_links_Kind_3 {
if ($NAME eq "Rolladen_links_Kind_3" ) {
  if (ReadingsVal("Rolladen_Kind_3","state","undef") ne "drive-up" && $EVENT == "on") { fhem "set Rolladen_Kind_3 extern open"}
  elsif (ReadingsVal("Rolladen_Kind_3","state","undef") eq "drive-up" && $EVENT == "off") { fhem "set Rolladen_Kind_3 extern stop"}
}
else {
  if (ReadingsVal("Rolladen_Kind_3","state","undef") ne "drive-down" && $EVENT == "on") { fhem "set Rolladen_Kind_3 extern open"}
  elsif (ReadingsVal("Rolladen_Kind_3","state","undef") eq "drive-down" && $EVENT == "off") { fhem "set Rolladen_Kind_3 extern stop"}
}
}


Der Vollständigkeit halber muss ich sagen, dass ich nur einen Taster für ein Rollo habe, also (Auf - Stop - Ab) und halt nur ein Tastsignal (Trigger) habe zum
steuern.

Wie könnte man das notify am besten anpassen?


rudolfkoenig

Im erwaehnten notify muss not == durch eq ausgetauscht werden (== ist Zahlenvergliech, eq Stringvergleich).
Wenn man kein stateFormat verwendet, dann kann man das notify verkuerzen, indem man ReadingsVal("meinRolloModul","state","undef") durch Value("meinRolloModul") ersetzt.


Hannibal1990

Habe es jetzt so abgeändert, funktioniert aber immer noch nicht  :-[

Rollladen_links_Kind_3 { if ($NAME eq "Rollladen_links_Kind_3" ) { if (ReadingsVal("Rolladen_Kind_3","state","undef")
ne "drive-up" && $EVENT eq "on") { fhem "set Rolladen_Kind_3 extern open"} elsif (ReadingsVal("Rolladen_Kind_3","state","undef")
eq "drive-up" && $EVENT eq "off") { fhem "set Rolladen_Kind_3 extern stop"} } else { if (ReadingsVal("Rolladen_Kind_3","state","undef")
ne "drive-down" && $EVENT eq "on") { fhem "set Rolladen_Kind_3 extern open"} elsif (ReadingsVal("Rolladen_Kind_3","state","undef")
eq "drive-down" && $EVENT eq "off") { fhem "set Rolladen_Kind_3 extern stop"} } }

rudolfkoenig

Ich habe das mal umformatiert, damit man es lesen kann:
Rollladen_links_Kind_3 {
  if ($NAME eq "Rollladen_links_Kind_3" ) {
       if (ReadingsVal("Rolladen_Kind_3","state","undef") ne "drive-up"   && $EVENT eq "on")  { fhem "set Rolladen_Kind_3 extern open"}
    elsif (ReadingsVal("Rolladen_Kind_3","state","undef") eq "drive-up"   && $EVENT eq "off") { fhem "set Rolladen_Kind_3 extern stop"}
  } else {
       if (ReadingsVal("Rolladen_Kind_3","state","undef") ne "drive-down" && $EVENT eq "on")  { fhem "set Rolladen_Kind_3 extern open"}
    elsif (ReadingsVal("Rolladen_Kind_3","state","undef") eq "drive-down" && $EVENT eq "off") { fhem "set Rolladen_Kind_3 extern stop"}
  }
}


Was dabei auffaellt:
- das notify reagiert nur auf "Rollladen_links_Kind_3", das spaeter mit "$NAME eq ..." abzufragen ist sinnlos, vermutlich willst du auch den anderen Kanal abhoeren, dieser muss in dem Notify-Regexp erwaehnt werden
- beide Zweige machen ein open, ein close fehlt.

Abgesehen davon ist "funktioniert immer noch nicht" eine schlechte Hilfe fuer mich/uns.
Ich empfehle die Loesung schrittweise zu bauen:
- im Event-Monitor alle benoetigten Events anzeigen: Event Monitor aufrufen, Knoepfe druecken
- im Event Monitor ein notify anlegen
- notify schrittweise(!) erweitern
- mit "trigger <event>" und beobachten des FHEM-Logs (das geht auch im Event-Monitor) ueberpruefen, ob das passiert was man will
- die letzten zwei Schritte wiederholen, bis man fertig ist.

Beta-User

Verdacht: Es liegt ggf. auch am Ereignis. Das könnte ggf. etwas länger sein, also .* ans Ende...
Rollladen_links_Kind_3.* { ...Bitte ggf. mal in den Eventmonitor sehen.
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