FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Frini am 20 Oktober 2015, 21:31:38

Titel: GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 20 Oktober 2015, 21:31:38
Hallo,
ich versuche gerade meine Rolladensteuerung weiter zu optimieren. Hintergrund ist wie so oft der WAF Faktor. Meine Frau möchte auch manuel das Rollo fahren und wenn die Tür dann wieder geschlossen wird, soll das Rollo auf den zuvor von meiner Frau penibel herausgefundenen Beschattungsgrad abhängig von dem derzeitigem Sonnenstand (Rollo auf 36,7 cm über den Fliesen) gefahren werden. Klingt komisch, ist aber leider so  :-\

Ich würd das gerne ohne ein weiteres Dummy lösen. Wenn möglich.

Gegeben ist: Rolladenaktor Homematic und Türgriffsensor.
Das Rollo soll, wenn die Tür geöffnet wurde, nach oben, oder analog gekippt in Lüftungsposition fahren.
Nach schließen der Tür soll das Rollo wieder in der vorher befindlichen Position gefahren werden.
Hierzu hab ich mal etwas rumgesucht und mir einen Code, der http://forum.fhem.de/index.php/topic,34688.0/nowap.html (http://forum.fhem.de/index.php/topic,34688.0/nowap.html) für ein notify beschrieben wurde, angepasst. Also die Idee, ich speichere den state-Wert in einem Reading, fahre das Rollo hoch und wenn ich den Türgriff wieder auf closed setze, kopiere ich den Wert aus dem Reading und nutze es als state-Wert zum wieder zu fahren des Rollos.
Leider bekomm ich immer Fehlermeldungen und das Rollo fährt weder hoch noch runter.
das ist aus dem DEF des DOIFS
([rol.eg.wz.RolladeGartenRechts] eq "0-80" and [sen.eg.wz.TerrassentuerRechts] eq "open")
({my $stat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"state",0);;fhem("setreading rol.eg.wz.RolladeGartenRechts last_state $stat")})
(set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "0-29" and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
({my $stat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"state",0);;fhem("setreading rol.eg.wz.RolladeGartenRechts last_state $stat")})
(set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] ne "up" and [sen.eg.wz.TerrassentuerRechts] eq "closed")
({my $oldStat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"last_state",0);;fhem("set rol.eg.wz.RolladeGartenRechts $oldStat")})


Das ist die Fehlermledung aus dem DOIF:
{my $oldStat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"last_state",0);;fhem("set rol.eg.wz.RolladeGartenRechts $oldStat")}: Bareword "rol" not allowed while "strict subs" in use at (eval 10286) line 1. Bareword "eg" not allowed while "strict subs" in use at (eval 10286) line 1. Bareword "wz" not allowed while "strict subs" in use at (eval 10286) line 1. Bareword "RolladeGartenRechts" not allowed while "strict subs" in use at (eval 10286) line 1.

Ich muss leider zugeben, dass mir das oben geschriebene wirklich gar nichts sagt. Bin ich hier auf dem Holzweg oder schon nah an der Lösung?

Hier ist der Auszug aus dem Logfile:
2015.10.20 21:23:15 2: doi.TerrassentueKomfort: {my $oldStat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"last_state",0);;fhem("set rol.eg.wz.RolladeGartenRechts $oldStat")}: Bareword "rol" not allowed while "strict subs" in use at (eval 10286) line 1.
Bareword "eg" not allowed while "strict subs" in use at (eval 10286) line 1.
Bareword "wz" not allowed while "strict subs" in use at (eval 10286) line 1.
Bareword "RolladeGartenRechts" not allowed while "strict subs" in use at (eval 10286) line 1.


Bitte schubst mich in die richtige Richtung

Grüße
Edit:
Hier die Lösung:
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "open") ## Wenn Rollade unten und Terrassentuer wird geöffnet
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo hoch
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] <= 80 and [sen.eg.wz.TerrassentuerRechts] eq "open") ## Wenn Rollade auf einer Position zwischen 0 - 80 und Terrassentuer wird geöffnet
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo hoch
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "tilted") ## Wenn Rollade unten und Terrassentuer wird gekippt zum Lüften
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo in Lüftungsposition
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] <= 30 and [sen.eg.wz.TerrassentuerRechts] eq "tilted") ## Wenn Rollade auf einer Position zwischen 0 - 30 und Terrassentuer wird gekippt zum Lüften
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo in Lüftungsposition
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "closed") ## Wenn das gespeicherte Reading ein Wert von down Rollo ganz unten hat und die Terrassentuer wird geschlossen
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state]) ## nutze das Reading und fahre das Rollo in die entsprechende Position zurück
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] <= 100 and [sen.eg.wz.TerrassentuerRechts] eq "closed") ## Wenn das gespeicherte Reading ein Wert von 0 - 100 hat und die Terrassentuer wird geschlossen
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state]) ## nutze das Reading und fahre das Rollo in die entsprechende Position zurück

Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: igami am 20 Oktober 2015, 21:42:33
Es fehlen Anführungszeichen.
Hier noch ein Auszug aus der Commandref zu DOIF
Zitat
Nutzung von Readings, Stati oder Internals im Ausführungsteil

Anwendungsbeispiel: Wenn ein Taster betätigt wird, soll Lampe1 mit dem aktuellen Zustand der Lampe2 geschaltet werden:

define di_button DOIF ([button]) (set lamp1 [lamp2])
attr di_button do always
Sollte im Prinzip das machen was du vor hast.
Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Damian am 20 Oktober 2015, 21:43:45
Abgesehen davon, dass du bei ReadingsVal dein Reading in Anführungszeichen setzen musst, würde ich es direkt ohne Perl lösen:

([rol.eg.wz.RolladeGartenRechts] eq "0-80" and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF...

Wie es weiter geht, kannst du dir bestimmt schon denken ;)

Gruß

Damian
Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 20 Oktober 2015, 22:05:50
Ich stehe sowas von auf dem Schlauch.
Hab jetzt beides versucht
([rol.eg.wz.RolladeGartenRechts] eq "0-80" and [sen.eg.wz.TerrassentuerRechts] eq "open")
({my $stat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"state",0);;fhem("setreading rol.eg.wz.RolladeGartenRechts "last_state" $stat")})
(set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "0-29" and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
({my $stat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"state",0);;fhem("setreading rol.eg.wz.RolladeGartenRechts "last_state" $stat")})
(set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] ne "up" and [sen.eg.wz.TerrassentuerRechts] eq "closed")
({my $oldStat=ReadingsVal(rol.eg.wz.RolladeGartenRechts,"last_state",0);;fhem("set rol.eg.wz.RolladeGartenRechts $oldStat")})


Da kommen die gleichen Fehlermeldungen.

Wenn ich das ohen Perl versuche, klappt es auch nicht.
([rol.eg.wz.RolladeGartenRechts] eq "0-80" and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "0-29" and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] ne "up" and [sen.eg.wz.TerrassentuerRechts] eq "closed")
(set rol.eg.wz.RolladeGartenRechts last_state)


Oder hab ich mich jetzt komplett verrannt.
Ich will ja, das Rollo erst wieder herunterfahren, wenn ich den Fenstertürgriff wieder zu schalte, also wenn wieder closed gesetzt wird.
Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Damian am 20 Oktober 2015, 22:20:48
({my $stat=ReadingsVal("rol.eg.wz.RolladeGartenRechts","state",0)...


oder

...(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state])


Gruß

Damian
Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 20 Oktober 2015, 22:57:47
Genial Danke  :D :D :D :D

Ich hab das jetzt so geschrieben:
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "36" and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "1-30" and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30)
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "closed")
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state])
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] ne "up" and [sen.eg.wz.TerrassentuerRechts] eq "closed")
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state])


Hab jetzt aber noch ein anderes Problem.
Die DOELSEIF abfragen auf feste Werte (down, up, 36) funktioniert. Wie kann ich denn einen Werte-Bereich pct 1-30 abfragen?
Mit 1-30 klappt es nicht "<30" klappt auch nicht.
Geht das überhaupt?

Aber schon einmal vieeeeelen Dank für Deine Hilfe.
Titel: Antw:DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 21 Oktober 2015, 09:53:28
Hab meinen blöden Fehler gefunden. Hier mal dir hoffentlich richtige Version. Werd ich leider erst heut abend testen können.
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "open") ## Wenn Rollade unten und Terrassentuer wird geöffnet
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo hoch
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] <= 80 and [sen.eg.wz.TerrassentuerRechts] eq "open") ## Wenn Rollade auf einer Position zwischen 0 - 80 und Terrassentuer wird geöffnet
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts on) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo hoch
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "tilted") ## Wenn Rollade unten und Terrassentuer wird gekippt zum Lüften
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo in Lüftungsposition
DOELSEIF
([rol.eg.wz.RolladeGartenRechts] <= 30 and [sen.eg.wz.TerrassentuerRechts] eq "tilted") ## Wenn Rollade auf einer Position zwischen 0 - 30 und Terrassentuer wird gekippt zum Lüften
(setreading rol.eg.wz.RolladeGartenRechts last_state [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30) ## schreibe die Position des Rollos in ein Reading und fahre das Rollo in Lüftungsposition
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] eq "down" and [sen.eg.wz.TerrassentuerRechts] eq "closed") ## Wenn das gespeicherte Reading ein Wert von down Rollo ganz unten hat und die Terrassentuer wird geschlossen
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state]) ## nutze das Reading und fahre das Rollo in die entsprechende Position zurück
DOELSEIF
([rol.eg.wz.RolladeGartenRechts:last_state] <= 100 and [sen.eg.wz.TerrassentuerRechts] eq "closed") ## Wenn das gespeicherte Reading ein Wert von 0 - 100 hat und die Terrassentuer wird geschlossen
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:last_state]) ## nutze das Reading und fahre das Rollo in die entsprechende Position zurück
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: locodriver am 26 Oktober 2015, 12:45:43
Hallo, ich weiß nicht, ob die Lösung mit HM-Aktoren korrekt funzt. Ich musste das noch etwas abwandeln:

DOELSEIF
([WZ_Balkon] eq "offen" and [?WZ_Rolare] ne "Auf")(setreading WZ_Rolare last_state [WZ_Rolare:pct], set WZ_Rolare Auf)
DOELSEIF
([WZ_Balkon] eq "geschlossen" and [?WZ_Rolare] eq "Auf")(set WZ_Rolare [WZ_Rolare:last_state],setreading WZ_Rolare last_state 100)


Das erste DOELSEIF speichert die Stellung aus dem Prozentreading und das Zweite DOELSEIF schreibt es zurück in den Set-Befehl und löscht das setreading (schreibt die obere Position).

Uwe.
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 26 Oktober 2015, 13:07:01
Hallo,
Ich nutze selber die HM Aktoren. Die im ersten Beitrag editierte Lösung funktioniert bei mir jetzt knapp ne Woche bestens.
Das Rollo fährt nach öffnen des Fensters wieder in die vorige Position zurück.
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: moonsorrox am 19 Februar 2016, 19:07:10
so es funktioniert nun bei mir auch..! schreibe aber hier (http://forum.fhem.de/index.php?topic=49680.msg413752#msg413752) weiter weil ich ein paar Logfile Fehler habe.
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: moonsorrox am 23 Februar 2016, 13:28:00
also so ganz funktioniert das bei mir doch noch nicht...!

Jeden morgen fährt der Rollladen nachdem er hoch gefahren ist wieder herunter.
Sicher weil er den "last_state" anfährt und der ist bei mir Runter, vom Abend..!

Habt ihr das nicht..?
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: Frini am 25 Februar 2016, 12:57:58
Nein das Verhalten habe ich nicht.
Ich check das noch mal am WE
Titel: Antw:GELÖST: DOIF: State-in Reading speichern und später wieder nutzen
Beitrag von: moonsorrox am 09 März 2016, 01:49:18
also ich habe das wieder raus genommen, weil ich doch unerklärliche Problem habe. Es funktioniert die ganze Woche über und dann am Wochenende bleibt er unten, oder es passierte das er hoch fuhr und sofort wieder runter.
Ich hatte dazu ein Beitrag (https://forum.fhem.de/index.php/topic,43638.msg420351.html#msg420351) unter DOIF geschrieben und da wurde mir geantwortet.

Ich werde das bei Gelegenheit nochmal angehen, denn dieses brauche ich ja eigentlich nur wenn ich mit Beschattung arbeite und die Zeit kommt ja erst noch  ;)