GELÖST: DOIF: State-in Reading speichern und später wieder nutzen

Begonnen von Frini, 20 Oktober 2015, 21:31:38

Vorheriges Thema - Nächstes Thema

Frini

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 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


igami

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.
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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frini

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.

Damian

({my $stat=ReadingsVal("rol.eg.wz.RolladeGartenRechts","state",0)...


oder

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


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frini

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.

Frini

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

locodriver

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.
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Frini

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.

moonsorrox

#9
so es funktioniert nun bei mir auch..! schreibe aber hier weiter weil ich ein paar Logfile Fehler habe.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

moonsorrox

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..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Frini

Nein das Verhalten habe ich nicht.
Ich check das noch mal am WE

moonsorrox

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 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  ;)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM