FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: chrisse111179 am 30 August 2020, 17:39:02

Titel: userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 17:39:02
Hallo,
ich habe in einem Rolladen eine userReadings angelegt das mir anzeigen sollt ob das dazugehörige Fenster offen, geschlossen oder gekippt ist.
Das funktioniert auch wunderbar, allerdings erst wenn sich ein Reading im Rollladen ändert.
Ist es möglich die Änderung im userReadings durch den Fenstersensor anzustoßen?

Im Moment sieht das userreadings so aus:
attr rollladen userReadings window {if(ReadingsVal("Balkontuer","state","") eq "closed") {return 0} elsif (ReadingsVal("Balkontuer","state","") eq "tilted") {return 2} elsif (ReadingsVal("Balkontuer","state","") eq "open") {return 1} else {return -1}}

Und ich hätte es gerne so, das klappt aber nicht:
attr rollladen userReadings window:[Balkontür] {if(ReadingsVal("Balkontuer","state","") eq "closed") {return 0} elsif (ReadingsVal("Balkontuer","state","") eq "tilted") {return 2} elsif (ReadingsVal("Balkontuer","state","") eq "open") {return 1} else {return -1}}

Vielleicht kann mich ja jemand auf den rechten Pfad führen.

Viele Grüße,
Christian
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Beta-User am 30 August 2020, 17:43:48
Kurz und knapp: Das geht nicht, nimm' ein notify oder einen anderen Event-Handler, wenn es unbedingt sein muß, die Info überhaupt zu doppeln... (für was soll das gut sein?)

(Ergänzend, auch wenn es hier nicht relevant ist: userReadings ohne sauberen Trigger sollte man vermeiden).
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 17:59:05
Hallo,
danke für die schnelle Antwort!
Ich versuche gerade die Automation meiner Rollläden zu vereinfachen. Das waren die ganze Zeit viele viele DOIFs,Timer und Dummys und Hastenichtgesehen.
Jetzt ist mir was abgeraucht und ich versuche alles simpler zu gestalten.
Indem ich in den Rollladendevices ein userattr mit Namen auto eigebaut habe und einen Weekdaytimer nutze der die Sollposition der Rollläden steuert konnte ich alles schon viel einfacher gestalten.
Das DOIF dazu sieht jetzt so aus:


DOIF
([Bewohner] eq "absent") (set auto=on my)
DOELSEIF
([Bewohner] eq "gone") (set auto=on on)
DOELSEIF
([Bewohner] eq "home" or [Rolllaeden_Soll_Dummy])(set auto=on [Rolllaeden_Soll_Dummy])


Der Gedanke war,dass man vielleicht in einer weiteren Zeile noch abfragen könnte ob das Fenster offen ist und den Rollladen entsprechend stellt.

Viele Grüße,
Christian
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Beta-User am 30 August 2020, 18:08:57
Na ja, für sowas ist es evtl. im Endergebnis einfacher, sich in AutoShuttersControl einzudenken. Ist zwar nicht einfach zu konfigurieren, aber dafür sehr mächtig...
(Ansonsten kennt auch WDT diverse Möglichkeiten, Fahrten zu verzögern oder das Ergebnis mit Perl zu bestimmen).
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 18:27:34
Ja,

ASC hatte ich schon zu Testzwecken im Einsatz. Leider klappt das mit den Setbefehlen und meinen Rollläden nicht vernünftig.
Ich weiß gar nimmer genau was das Problem war...ich glaube, dass ASC on, off und my nicht unterstützt, sondern nur prozentuale Positionsangaben.

Naja, dann werde ich mir wohl weiter das Hirn zermartern und bedanke mich für deine Mühe!

Grüße,
Christian
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Beta-User am 30 August 2020, 18:33:04
Na ja, schon mal mit eventMap getestet, ob man die Fahrbefehle entsprechend umbiegen kann? Gibt zwischenzeitlich diverse Lösungen für "spezielle" Hardware...
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Damian am 30 August 2020, 19:17:20
Zitat von: chrisse111179 am 30 August 2020, 17:39:02
Und ich hätte es gerne so, das klappt aber nicht:
attr rollladen userReadings window:[Balkontür] {if(ReadingsVal("Balkontuer","state","") eq "closed") {return 0} elsif (ReadingsVal("Balkontuer","state","") eq "tilted") {return 2} elsif (ReadingsVal("Balkontuer","state","") eq "open") {return 1} else {return -1}}

So etwas kannst du mit DOIF_Readings oder Event_Readings im DOIF machen:

https://fhem.de/commandref_DE.html#DOIF_DOIF_Readings

Wenn du mit ASC nicht weiterkommst, kannst du dir auch generalisierte Lösungen im DOIF anschauen, bevor du für jedes Fenster ein DOIF-Modul definierst :)

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 19:25:27
Ok,
danke für den Tipp!
Ich schaue mir das morgen an und gebe Laut.

Schönen Restsonntag an alle!
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 21:28:33
Hey,
ich habe mir das angeschaut und denke die Geschichte mit dem DOIF-Templates ist das was ich möchte.
Ich brauche nur Hilfe dabei das im Perl-Modus zu schreiben.

Im Grunde möchte ich das:
DOIF
([Bewohner] eq "absent") (set TYPE=SOMFY my)
DOELSEIF
([Bewohner] eq "gone") (set TYPE=SOMFY on)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "open")(set $3 off)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "open")(set $3 off)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "open")(set $3 off)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "tilted")(set $3 my)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "tilted")(set $3 my)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "tilted")(set $3 my)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "closed")(set $3 on)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "closed")(set $3 on)
DOELSEIF
([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "closed")(set $3 on)

TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Esszimmer,Rollladen_Esszimmer)
TPL_rollladen (Rolllaeden_Soll_Dummy,Rollladen_BlueSaloon,Fenster_BlueSaloon)
TPL_rollladen (Rolllaeden_Soll_Dummy,Rollladen_Balkontuer,Balkontuer)
TPL_rollladen (Rolllaeden_Soll_Dummy,Rollladen_Fenster,Kuechenfenster)
TPL_rollladen (Rolllaeden_Soll_Dummy,Rollladen_Wohnzimmer_links,Fenster_Wohnzimmer_links)
TPL_rollladen (Rolllaeden_Soll_Dummy,Rollladen_Wohnzimmer_rechts,Fenster_Wohnzimmer_rechts)


Das, wenn ich alles richtig verstehe, kann ich ja aber so nicht einfach in den FHEM-Editor hacken.
Wie müsste das aussehen?

Viele Grüße!
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Damian am 30 August 2020, 21:48:24
siehe hier: https://wiki.fhem.de/wiki/DOIF/Templates

Ansonsten brauchst du etwas Perlgrundlagen:

if (...) {fhem_set("bla on")} elsif (...) {fhem_set("bla2 on")}...
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 21:55:30
Ich habe mir in der Zwischenzeit versucht die frage selbst zu beantworten.
Etwa so?
defmod Rolllaeden_Automation_DOIF DOIF DEF TPL_rollladen (
{
if ([Bewohner] eq "absent") {
fhem_set($3 my);;
} elseif ([Bewohner] eq "gone") {
fhem_set ($3 on);;
} elseif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "open") {
fhem_set (set $3 off);;
} elseif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "open") {
fhem_set (set $3 off);;
} elseif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "open") {
fhem_set (set $3 off);;
} elseif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "tilted") {
fhem_set ($3 my)
} elseif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "tilted") {
fhem_set ($3 my)
} elseif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "tilted") {
fhem_set ($3 my)
} elseif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "closed") {
fhem_set (§3 on)
} elseif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "closed") {
fhem_set (§3 on)
} elseif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "closed") {
fhem_set (§3 on)
}
}
)

TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Esszimmer,Rollladen_Esszimmer)
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_BlueSaloon,Rollladen_BlueSaloon)
TPL_rollladen (Rolllaeden_Soll_Dummy,Balkontuer,Rollladen_Balkontuer)
TPL_rollladen (Rolllaeden_Soll_Dummy,Kuechenfenster,Rollladen_Fenster)
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Wohnzimmer_links,Rollladen_Wohnzimmer_links)
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Wohnzimmer_rechts,Rollladen_Wohnzimmer_rechts)
Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: Damian am 30 August 2020, 22:18:11
so ungefähr,

Templatedefinition muss zusätzlich in runde Klammern:

DEF TPL_rollladen (...)

es heißt elsif und nicht elseif

Du kannst deine Abfragen auch so zusammenfassen, das nur einmal set off, set my oder set on vorkommt ;)


Titel: Antw:userReadings mit anderem Device triggern
Beitrag von: chrisse111179 am 30 August 2020, 22:52:01
 ;D du machst mich feddisch!

Also zuerst die gute Nachricht:
Dank deiner Hilfe habe ich eine funktionierende Syntax hinbekommen:

defmod Rolllaeden_Automation_DOIF_TPL DOIF DEF TPL_rollladen (\
{\
if ([Bewohner] eq "absent") {\
fhem_set("$3 $5");;;;\
} elsif ([Bewohner] eq "gone") {\
fhem_set("$3 $6");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "open") {\
fhem_set("$3 $6");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "open") {\
fhem_set("$3 $6");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "open") {\
fhem_set("$3 $6");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "tilted") {\
fhem_set("$3 $5");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "tilted") {\
fhem_set("$3 $5");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "tilted") {\
fhem_set("$3 $5");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "my" and [$2] eq "closed") {\
fhem_set("$3 $4");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "on" and [$2] eq "closed") {\
fhem_set("$3 $4");;;;\
} elsif ([Bewohner] eq "home" and [$1] eq "off" and [$2] eq "closed") {\
fhem_set("$3 $4");;;;\
}\
}\
)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Esszimmer,Rollladen_Esszimmer,on,go-my,off)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_BlueSaloon,Rollladen_BlueSaloon,on,go-my,off)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Balkontuer,Rollladen_Balkontuer,on,go-my,off)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Kuechenfenster,Rollladen_Fenster,on,go-my,off)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Wohnzimmer_links,Rollladen_Wohnzimmer_links,on,go-my,off)\
TPL_rollladen (Rolllaeden_Soll_Dummy,Fenster_Wohnzimmer_rechts,Rollladen_Wohnzimmer_rechts,on,go-my,off)


Darüber wie ich das in weniger Code zusammenfasse muss ich erstmal ne Nacht schlafen.
Danke für die Mühe!