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
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
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.
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.
Zitat(set ... ...,
macht es für mich schwierig zu helfen.
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?
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
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
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.
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
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
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
: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