Devicestatus speichern zur späteren Wiederherstellung

Begonnen von Gruby, 05 März 2015, 15:09:43

Vorheriges Thema - Nächstes Thema

Gruby

Hallo zusammen,

ich suche nach einem Lösungsansatz für folgenden Anwendungsfall:

Rollo an der Terrassentür ist auf 50% (oder beliebig anderer Status) bei geschlossener Tür, bei öffnen der Tür soll der Rollo auf 0% fahren und beim späteren schließen der Tür wieder zurück auf 50%

Hat hier jemand eine Idee wie ich den Status vom Rollo (in Prozent) speichern kann um ich später wiederherzustellen?

marvin78


Gruby

Zitat von: marvin78 am 05 März 2015, 15:18:39
setreading DEVICE last_state 50

Das habe ich bereits versucht, nur 50% war ein Beispiel für einen belieben Status zwischen 0 und 100 der wiederhergestellt werden soll.

Zu diesem Lösungsvorschlag mit setreading wäre dann die Frage des Auslesens des aktuellen Device Status. Also irgendwas wie "setreading DEVICE last_state DEVICE:State"
wenn es das gibt.

Gruby

übrigens...
mit ReadingsHistory habe ich auch bereits herumgetüftelt allerdings bin ich mangels aussagekräftiger Dokumentation des Befehls oder Beispielen auch hiermit gescheitert

marvin78

Du hast nur gefragt, wie du ihn setzen kannst. Du solltest deine Fragen präziser stellen. Auch solltest du etwas über den Kontext sagen. Ich vermute, dass du schon ein notify hast? Warum postest du nicht was du hast?

Ich komme zu der Einschätzung, dass du einen fertigen Code haben möchtest und keine Hilfe.

Ein Reading auslesen kannst du mit ReadingsVal. EinsteigerPDF, commandref etc. kennst du?

Und da ich nett bin, ein Beispiel:

DEVICE:open {my $stat=ReadingsVal($NAME,"state",0);fhem("setreading $NAME last_state $stat")}

DEVICE:closed {my $oldStat=ReadingsVal($NAME,"last_state",0);fhem("set $NAME $oldStat")}

Codes sind für den DEF Bereich der notifys im Frontend.

Edit: Ich weiß nicht, wie du auf readingsHistory kommst, aber die Doku dazu ist sehr wohl aussagekräftig.

Gruby

#5
Sorry wenn ich etwas zu unspezifisch war... dachte ich hätte es klar geschrieben.

Danke auf jeden Fall schon mal für den Tip, damit bin ich schon etwas weiter gekommen.

Mit diesem Notify bekomme ich last_stat  für den Rollo mit einem Trigger gesetzt bevor dieser hoch fährt:

define NT_RolloWZTerrasse_set notify NT_RolloWZTerrasse_set {my $stat=ReadingsVal("EIB_1202","state",0);;fhem("setreading EIB_1202 last_state $stat")}

Ergebnis:
last_state  67 %

nun kommt das nächste Problem... wie kann ich dieses Value nun als Binärwert für den Reset benutzen? (ich vermute das % stört)

Mein Versuch schaut wie folgt aus, funktioniert aber nicht:
define NT_RolloWZTerrasse_reset notify NT_RolloWZTerrasse_reset {my $oldStat=ReadingsVal("EIB_1202","last_state",d);;fhem("set EIB_1202 $oldStat")}

Über einen weiteren Wink mit dem Zaunpfahl wäre ich dankbar.



marvin78

Mit funktioniert nicht kann man wenig anfangen. Steht was im Log? Was funktioniert genau nicht?

wo kommt das d in

ReadingsVal("EIB_1202","last_state",d)

her? Schreib dort mal 0 hin.

Gruby

habs geändert... war wohl eine Leiche der verschiedenen Versuche.

define NT_RolloWZTerrasse_reset notify NT_RolloWZTerrasse_reset {my $oldStat=ReadingsVal("EIB_1202","last_state","0");;fhem("set EIB_1202 $oldStat")}

leider ebenfalls kein Erfolg.

marvin78

Zitat von: marvin78 am 05 März 2015, 20:48:37
Mit funktioniert nicht kann man wenig anfangen. Steht was im Log? Was funktioniert genau nicht?

Code für den DEF Bereich im Frontend:

NT_RolloWZTerrasse_reset {my $oldStat=ReadingsVal("EIB_1202","last_state","0");fhem("set EIB_1202 $oldStat")}

Gruby

Jep... ganau so steht es im Frontend unter DEF.
Im Log (fhem.log) ist es komplett still beim ausführen beider Notfiy's und es funktioniert der Befehl "set EIB_1202 $oldStat" nicht.

Ich vermute dass der Befehl nach dem Beispiel wie folgt initiiert wird: "set EIB_1202 67 %"

da der Befehl {ReadingsVal("EIB_1202","last_state","0")} die Ausgabe "67 %" bringt.

Gruby

Hat keiner einen Rat, oder zielführende Flugrichtung parat?

Mitch

Du musst das % Zeichen abschneiden.
Such mal hier im Forum, da gibt es irgendwo eine gute Anleitung (irgendwas mit Einheiten abschneiden)
FHEM im Proxmox Container

marvin78


franky08

Laut commandref geht es auch so:
ZitatUm auf die Gerätestati/Attribute zuzugreifen benutzen Sie bitte die folgenden Funktionen:
Value(<devicename>)
gibt den Status eines Gerätes zurück (entsprechend dem Ausdruck in Klammern, den Sie beim List-Befehl sehen).

OldValue(<devicename>)
OldTimestamp(<devicename>)
gibt den vorherigen Wert/Zeitstempel des Gerätes zurück.

ReadingsVal(<devicename>,<reading>,<defaultvalue>)
Gibt den Inhalt der "readings" zurück (den Inhalt der in dem "Readings"-Abschnitt von "list device" angezeigt wird)

ReadingsNum(<devicename>,<reading>,<defaultvalue>)
Wie ReadingsVal, löscht aber alles, was kein Zahl ist, um den Wert bei Berechnungen verwenden zu können.

AttrVal(<devicename>,<attribute>,<defaultvalue>)
Gibt die gesetzteb Attribute des Gerätes zurück

ReadingsNum sollte dann nur die Zahl zurück geben.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

MaxAut

Hallo!

Der Thread ist zwar schon älter, aber ich habe Ähnliches vor. Ich habe einen Dummy angelegt, in dem ich meinen Anwesenheitsstatus speichere. In diesem Dummy möchte ich auch gerne den vorherigen Zustand speichern. Das mache ich mir mit unterschiedlichen Notifies -- je nachdem worauf ich reagieren möchte. Das setzen des Status klappt einwandfrei, auch das von mir angelegte Reading "previous" wird befüllt, allerdings nicht mit dem Wert den ich erwarte (also dem vorherigen Status), sondern mit dem neuen Status.

Hier ist der Code meines Notify:

TasterSchnittstelleEingangOpen:trigger:.* {
my $previous = ReadingsVal("dummy_Anwesenheit","state","error");
fhem("setreading dummy_Anwesenheit previous $previous");
fhem("set dummy_Anwesenheit anwesend");
}


Vor der Ausführung war der Status des Dummy auf "abwesend". Danach waren sowohl Status als auch das Reading previous auf "anwesend". Das previous Reading sollte aber "abwesend" sein. Ich verstehe nicht was ich falsch mache. Hat jemand einen Lösungsvorschlag?

Liebe Grüße,
Max