DOIF als Taster bzw. selbst wieder auf off setzend programmieren

Begonnen von RockThisParty, 09 April 2018, 09:57:04

Vorheriges Thema - Nächstes Thema

RockThisParty

Hallo DOIF-Experten!

Da ich offenbar mit einigen von Euch den  Hang zum kompakten/ eleganten Prgrammieren teile, bitte ich um Beratung, ob das folgende auch ohne ,at' geht  ;)

Um den Schalter über Homebridge / Siri sinnvoll nutzen zu können, brauche ich quasi einen Taster, d.h. Nach dem Schalten auf ,on' muss der Status automatisch auf off zurückfallen.

Ich habe das jetzt so gelöst:
([mc_kueche_taste_3:"dimupdown"])
(set ... ..., define a1 at +00:00:03 set mc_kueche_3_lang off)
DOELSE (1)
attr mc_kueche_3_lang cmdState on|off
attr mc_kueche_3_lang do always
attr mc_kueche_3_lang genericDeviceType switch
attr mc_kueche_3_lang room DOIF,Homekit,Kueche
attr mc_kueche_3_lang setList on off
attr mc_kueche_3_lang siriName NDR Info


Alle Versuche, das direkt im DOIF zu machen, z.B set $SELF off, führten dazu, dass ich einen zusätzlichen Status cmd_1 bekam statt off.

So wie dargestellt, funktioniert es, aber eigentlich müsste das doch schöner gehen?

Viele Grüße
Stefan

Damian

Zitat von: RockThisParty am 09 April 2018, 09:57:04
Hallo DOIF-Experten!

Da ich offenbar mit einigen von Euch den  Hang zum kompakten/ eleganten Prgrammieren teile, bitte ich um Beratung, ob das folgende auch ohne ,at' geht  ;)

Um den Schalter über Homebridge / Siri sinnvoll nutzen zu können, brauche ich quasi einen Taster, d.h. Nach dem Schalten auf ,on' muss der Status automatisch auf off zurückfallen.

Ich habe das jetzt so gelöst:
([mc_kueche_taste_3:"dimupdown"])
(set ... ..., define a1 at +00:00:03 set mc_kueche_3_lang off)
DOELSE (1)
attr mc_kueche_3_lang cmdState on|off
attr mc_kueche_3_lang do always
attr mc_kueche_3_lang genericDeviceType switch
attr mc_kueche_3_lang room DOIF,Homekit,Kueche
attr mc_kueche_3_lang setList on off
attr mc_kueche_3_lang siriName NDR Info


Alle Versuche, das direkt im DOIF zu machen, z.B set $SELF off, führten dazu, dass ich einen zusätzlichen Status cmd_1 bekam statt off.

So wie dargestellt, funktioniert es, aber eigentlich müsste das doch schöner gehen?

Viele Grüße
Stefan

siehe on-for-timer-Beispiel hier https://fhem.de/commandref_DE.html#DOIF_Weitere_Anwendungsbeispiele
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

Hi,

Hier am Beispiel meiner Beleuchtung.
defmod Licht_Kammer DOIF ([GPIO_IN_15:"^on$"] and [?OUT_1:PortB3] eq "off") (set OUT_1 PortB3 on) (set OUT_1 PortB3 off)\
DOELSEIF ([GPIO_IN_15:"^on$"] and [?OUT_1:PortB3] eq "on") (set OUT_1 PortB3 off)\
DOELSEIF ([GPIO_IN_15:"^Longpress:.on$"] and [?OUT_1:PortB3] eq "off") (set OUT_1 PortB3 on)
attr Licht_Kammer cmdpause 2:2:2:2
attr Licht_Kammer do always
attr Licht_Kammer wait 0,180:0:0:0


cmd1: Taster kurz -> Licht an und nach 3 Minuten wieder aus (wait Attribut)
cmd2: Taster kurz wenn Licht an -> Licht aus
cmd3: Taster lang drücken -> Licht Dauer-an.

deine Anforderung findest in cmd1.

RockThisParty

Vielen Dank für die prompten Antworten.
Eure Beispiele passen leider nicht komplett, da ich kein Device/Dummy habe, den ich umschalten kann. Das wollte ich wegen "Kompaktheit" vermeiden ;-)
Mit wait hatte ich experimentiert, aber wie geschrieben bekomme ich beim Versuch, den state des DOIF aus sich selbst heraus zu setzen immer einen zusätzlichen Status cmd_1 und nicht nur on/off. Homebridge braucht aber on/off.

@Damian: Dennoch danke für Deinen Hinweis für das on-for-timer-Beispiel, das kann ich an anderer Stelle gut gebrauchen  ;D Das ist viel schöner als meine Lösung.

rabehd

Zitat(set ... ...,
macht es für mich schwierig zu helfen.
Auch funktionierende Lösungen kann man hinterfragen.

Frank_Huber

Zitat von: RockThisParty am 09 April 2018, 10:28:13
Vielen Dank für die prompten Antworten.
Eure Beispiele passen leider nicht komplett,

Die Beispiele müssen auch nicht komplett passen, Du musst Dir nur deine Lösung ableiten können.

Oder sollen wir dir deinen ganzen Code schreiben?

Damian

Ich denke die Beispiele passen sehr gut zu deinem Problem, du musst sie nur für dich richtig übersetzen, z. B.

DOIF ([Ereignis]) (schalte etwas ein)(schalte etwas aus)

do always
wait 0,180
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RockThisParty

Nochmal danke für die Kommentare.

Nein, ich erwarte natürlich keinen fertigen Code und habe gestern schon viel Zeit mit der Lösungssuche verbracht. Meine Hemmschwelle, hier zu posten und mein Ehrgeiz, das selbst zu lösen sind ziemlich hoch.

Der meiner Meinung nach entscheidende Punkt ist, dass ich das DOIF selbst als Homebridge-Switch nutze und darum das DOIF selbst den Status on / off annehmen muss. Ich habe es nicht geschafft, dass das DOIF sich selbst auf "off" setzt.

ABER offenbar war meine Frage zu allgemein und mein Versuch, durch Kürzung des DOIFs die Frage auf das m.E. wesentliche zu reduzieren, eher hinderlich.
Ich poste heute Abend oder morgen mal das komplette Listing. Komme derzeit nicht gut ans System ran.

Viele Grüße,
Stefan

RockThisParty

Nun hat es mir doch keine Ruhe gelassen.
So hatte ich mir das eigentlich vorgestellt, am Ende cmd_1_2 bleibt als Status aber cmd_1 stehen und nicht off.

Internals:
   DEF        ([mc_kueche_taste_1:"dimupdown"])
(set MC_Kueche off, {Log3 "MC_Kueche",3,"DOIF Warten vor Einschalten mit NDR1"})
(attr MC_Kueche FavoriteNetRadioChannel 0,
set MC_Kueche TurnFavNetRadioChannelOn,
{Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR1"})
(set $SELF cmd_2)
DOELSE ()
   NAME       mc_kueche_1_lang
   NR         351
   NTFY_ORDER 50-mc_kueche_1_lang
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-04-09 12:10:21   cmd             1.3
     2018-04-09 12:10:21   cmd_event       set_on_cmd_1
     2018-04-09 12:10:21   cmd_nr          1
     2018-04-09 12:10:21   cmd_seqnr       3
     2018-04-09 11:59:41   mode            enabled
     2018-04-09 12:10:21   state           cmd_1
     2018-04-09 12:10:21   wait_timer      no timer
   Regex:
   condition:
     0          EventDoIf('mc_kueche_taste_1',$hash,'dimupdown',1)
   devices:
     0           mc_kueche_taste_1
     all         mc_kueche_taste_1
   do:
     0:
       0          set MC_Kueche off, {Log3 "MC_Kueche",3,"DOIF Warten vor Einschalten mit NDR1"}
       1          attr MC_Kueche FavoriteNetRadioChannel 0,  set MC_Kueche TurnFavNetRadioChannelOn,  {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR1"}
       2          set mc_kueche_1_lang cmd_2
     1:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event     
     globalinit 1
     last_timer 0
     sleepdevice set_on_cmd_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     triggerEvents
     triggerEventsState
   internals:
   itimer:
   readings:
   trigger:
     all         mc_kueche_taste_1
   uiState:
   uiTable:
Attributes:
   cmdState   on|off
   cmdpause   10
   do         always
   genericDeviceType switch
   room       DOIF,Homekit,Kueche
   setList    on off
   siriName   NDR1
   wait       0,2,1


Wenn ich das set $SELF cmd_2 durch define a1 at +00:00:03 set mc_kueche_3_lang off ersetze (natürlich im cmd_1_1 und dann nicht mehr getrennt), geht es.

Frank_Huber

Zitat von: RockThisParty am 09 April 2018, 12:17:15
Wenn ich das set $SELF cmd_2 durch define a1 at +00:00:03 set mc_kueche_3_lang off ersetze (natürlich im cmd_1_1 und dann nicht mehr getrennt), geht es.

hinter cmd_2 steht ja auch kein befehl.
DOELSE ()
macht genau gar nichts.

DOELSE (set mc_kueche_3_lang off)
wäre der richtige cmd_2

RockThisParty

#10
Den Vorschlag fand ich schlüssig.
Konnte es nur zwischen Tür und Angel testen ... führt scheinbar zu einer Endlosschleife und 100% Systemlast. Hatte die Konfi zum Glück noch in gespeichert und habe den Raspi per Netzkabel resettet.
Ich probiere es nachher nochmal aus.
Danke und Gruß
Stefan

Brockmann

Zitat von: RockThisParty am 09 April 2018, 10:28:13
Mit wait hatte ich experimentiert, aber wie geschrieben bekomme ich beim Versuch, den state des DOIF aus sich selbst heraus zu setzen immer einen zusätzlichen Status cmd_1 und nicht nur on/off. Homebridge braucht aber on/off.
Wenn es nur daran scheitert, dann ändere doch den DOIF-Status auf on/off wie Du es brauchst:
https://fhem.de/commandref_DE.html#DOIF_cmdState

RockThisParty

 :D
Danke, so gehts, wenn ich den state für cmd_1_1 auf off definiere.
Ich hatte in irgendeinem älteren Foren-Thread gelesen, dass man Sub-state nicht überschreiben kann ... hätte mal lieber in die commandref schauen sollen.
Sorry für unnötige Welle hier und Danke für alle Antworten.

So sieht es jetzt aus:
([mc_kueche_taste_1:"dimupdown"])
(set MC_Kueche off, {Log3 "MC_Kueche",3,"DOIF Warten vor Einschalten mit NDR1"})
(attr MC_Kueche FavoriteNetRadioChannel 0,
set MC_Kueche TurnFavNetRadioChannelOn,
{Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR1"})
DOELSE ()

attr mc_kffueche_1_lang cmdState on,off|off
attr mc_kueche_1_lang cmdpause 10
attr mc_kueche_1_lang do always
attr mc_kueche_1_lang genericDeviceType switch
attr mc_kueche_1_lang room DOIF,Homekit,Kueche
attr mc_kueche_1_lang setList on off
attr mc_kueche_1_lang siriName NDR1
attr mc_kueche_1_lang wait 0,2