FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Freee84neu am 05 Juni 2020, 18:39:06

Titel: Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 05 Juni 2020, 18:39:06
Hallo

Ich habe einen Sonoff 4CH der über MQTT2 in FHEM eingebunden ist mit dem ich eine Leinwand hoch und runter fahre.
Über der Channel 3(Reading "POWER3" ON/OFF) fahre ich sie runter über Channel 4(Reading "POWER4" ON/OFF) fahre ich sie wieder hoch. Jetzt wollte ich mir mit einem userreading ein Reading erstellen welches speichert, welches Reading als letztes "ON" war.

statePosition {if(ReadingsVal("Leinwand","POWER3","") eq "ON") {return 1} if (ReadingsVal("Leinwand","POWER4","") eq "ON") {return 2} }

Das Reading sieht jetzt so aus. Es funktioniert auch eigentlich jedoch sobald die Readings wieder beide OFF sind ist das userreading leer. Wie kann ich das verhindern ?

Gruß
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 05 Juni 2020, 21:19:27
Hi,

nach meiner Erfahrung geht das so nicht. Du musst das mit einem notify und setreading machen.
Begründung: Irgendwas liefert der Code {} immer zurück - wenn nichts dann eben nichts ;)

Gruß Otto
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 05 Juni 2020, 22:18:22
Hmm... 

Hab es mal mit einem setreading probiert

Runter:POWER3:.ON {fhem ("setreading Leinwand statePosition Unten")},Hoch:POWER4:.ON {fhem ("setreading Leinwand statePosition Oben")}

Bekomme aber die Meldung

'setreading Leinwand statePosition Unten' called form userReadings is prohibited

Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 05 Juni 2020, 22:36:45
Du musst das mit einem notify und setreading ...

Ich habe gesagt: es geht nicht mit einem userReadings - aber Du musst es nicht glauben.

Das ist nur geraten, genauer geht es mit dem Eventmonitor
define n_bla notify Leinwand:(POWER3:|POWER4:).ON setreading Leinwand statePosition $EVTPART0

Gruß Otto
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 05 Juni 2020, 22:40:17
Hmm

Wollte es eigentlich in dem device lassen und nicht wieder was extra machen.
So wie es jetzt drin steht kann ich es in ein dummy rein schreiben aber nicht ins eigene device ...

Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 05 Juni 2020, 22:57:10
Verstehe ich nicht. Du hat ein notify extra und schreibst ein reading in deinem device.

Bessere Variante:
define n_bla notify Leinwand:(POWER3|POWER4):.ON setreading Leinwand statePosition {("$EVTPART0" eq "POWER3:" ? "unten" : "oben")}

Aber Dein System :)

Edit: Dein nicht funktionierendes userReadings musst Du natürlich löschen. ;)
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 05 Juni 2020, 23:21:20
Erstmal danke für deine Hilfe.

Du hast ja recht ist nur ein notify. Aber dachte halt das es auch so geht. Da ich es ja auch so in ein Dummy schreiben kann.

Und naja zu meinem System. Ich denke wenn da irgendeiner von hier mal reinschauen würde. Der würde vor Lachen zusammenbrechen😉 ...

Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 05 Juni 2020, 23:39:22
Naja ich sage mal, mit einem Trigger könnte es als userReadings gehen, mit deinem Code:
Position:(POWER3|POWER4):.ON {if(ReadingsVal("Leinwand","POWER3","") eq "ON") {return 1} if (ReadingsVal("Leinwand","POWER4","") eq "ON") {return 2}}

Aber natürlich nur wenn POWERx auch wieder !ON gesetzt wird.
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 06 Juni 2020, 07:40:27
Super genau so gehts ...

Das Reading POWERX wird immer neu auf ON gesetzt sobald der motor fährt und das egal ob ich ihn per Hand fahre oder über FHEM

Also hab ich am Anfang den Trigger vergessen ...
Super vielen vielen Dank
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 06 Juni 2020, 22:36:56
Wollte gerade nochmal versuchen darzustellen Leinwand in Mittelstellung. Also wenn einer die Leinwand vorher gestopft hat.

statePosition:((POWER3|POWER4):.ON|state:.Stop) {if(ReadingsVal("Leinwand","POWER3","") eq "ON") {return 1} if (ReadingsVal("Leinwand","POWER4","") eq "ON") {return 2} if (ReadingVal("Leinwand","state","") eq "Stop") {return 3}}

Wenn jemand die Leinwand stoppt habe ich im state Stop stehen. Und wollte dann zusätzlich darauf noch triggern. Aber das möchte es irgendwie nicht.
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 06 Juni 2020, 23:22:02
Siehst Du denn den entsprechenden Event im Eventmonitor? "state" fehlt normalerweise im Event.
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 06 Juni 2020, 23:52:59
Im Event Montitor ist nix zu sehen ...


2020-06-06 23:42:33 MQTT2_DEVICE Leinwand on3
2020-06-06 23:42:34 MQTT2_DEVICE Leinwand POWER3: ON
2020-06-06 23:42:34 MQTT2_DEVICE Leinwand statePosition: 1
2020-06-06 23:42:35 structure Licht_Gruppe_Aussenbeleuchtung ON
2020-06-06 23:42:35 MQTT2_DEVICE Aussenbeleuchtung_Hinten Time: 2020-06-06T22:42:34
2020-06-06 23:42:35 MQTT2_DEVICE Aussenbeleuchtung_Hinten Uptime: 14T03:57:49
2020-06-06 23:42:35 MQTT2_DEVICE Aussenbeleuchtung_Hinten Wifi_RSSI: 66
2020-06-06 23:42:35 MQTT2_DEVICE Aussenbeleuchtung_Hinten UptimeSec: 1223869
2020-06-06 23:42:35 MQTT2_DEVICE Aussenbeleuchtung_Hinten Wifi_Signal: -67
2020-06-06 23:42:35 MQTT2_DEVICE Huette_Kuehlschrank Time: 2020-06-06T22:42:35
2020-06-06 23:42:35 MQTT2_DEVICE Huette_Kuehlschrank Uptime: 14T03:57:46
2020-06-06 23:42:35 MQTT2_DEVICE Huette_Kuehlschrank Wifi_RSSI: 74
2020-06-06 23:42:35 MQTT2_DEVICE Huette_Kuehlschrank UptimeSec: 1223866
2020-06-06 23:42:35 MQTT2_DEVICE Huette_Kuehlschrank Wifi_Signal: -63
2020-06-06 23:42:36 MQTT2_DEVICE Leinwand Stop
2020-06-06 23:42:36 MQTT2_DEVICE Leinwand POWER3: OFF



Kann man das irgendwie einschalten oder so ?


Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 00:08:29
Hmm wollte jetzt das state in ein andere Reading "State schreiben, um ein Event zu bekommen.

State { ReadingsVal("Leinwand","state",0) }, statePosition:((POWER3|POWER4):.ON|State:.Stop) {if(ReadingsVal("Leinwand","POWER3","") eq "ON") {return 1} if (ReadingsVal("Leinwand","POWER4","") eq "ON") {return 2} if (ReadingVal("Leinwand","State","") eq "Stop") {return 3}}

2020-06-07 00:02:24 MQTT2_DEVICE Leinwand on4
2020-06-07 00:02:24 MQTT2_DEVICE Leinwand State: on4
2020-06-07 00:02:24 MQTT2_DEVICE Leinwand POWER4: ON
2020-06-07 00:02:24 MQTT2_DEVICE Leinwand statePosition: 2
2020-06-07 00:02:24 MQTT2_SERVER MQTT2_Server nrclients: 61
2020-06-07 00:02:27 MQTT2_DEVICE Leinwand Stop
2020-06-07 00:02:27 MQTT2_DEVICE Leinwand State: Stop
2020-06-07 00:02:27 MQTT2_DEVICE Leinwand POWER4: OFF


Klappt aber leider auch nicht trotz Event
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: amenomade am 07 Juni 2020, 02:05:18
Was willst Du genau erreichen?

POWER4: ON triggert das userReading statePostion. Das 2. if im Perl Code ist wahr. Dann sollte dein statePosition auf 2 springen. Man sieht das auch.

Dann kommt Stop. Das triggert auch das userReading. Das 2. if im Perl Code ist immer noch wahr. Dann bleibt statePosition auf 2.

Erst dann kommt POWER4 OFF. Das triggert aber nicht das userReading. Passiert nix
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 10:36:09
Ja macht Sinn die Aktion kommt vor der Reaktion.

War wohl gestern Abend zu spät.

Ich möchte erreichen das wenn ich auf Stop gehe. Eine neue Position gemeldet wird. Aber da state bzw. State von fhem gesetzt wir (Aktion) und das Reading POWER vom MQTT Device (Reaktion) ist mein Trigger so nicht möglich.

Hmm sehe da jetzt gerade auch keine Möglichkeit...
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 07 Juni 2020, 11:24:21
2020-06-06 23:42:36 MQTT2_DEVICE Leinwand StopDas meinte ich: state: fehlt normalerweise.
Beim notify gibt es addStateEvent dafür.

Den trigger einfach ändern?
statePosition:((POWER3|POWER4):.ON|Stop)

Gruß Otto
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: amenomade am 07 Juni 2020, 12:08:51
Ich würde eher einfach die Reihenfolge von den "if" Bedingungen / return ändern.
Weil irgendwie "Stop" Vorrang hat
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 15:24:41
Sollte es nicht mit dem userreadings klappen, werde ich es einfach so lassen. Ist schon OK so. Das andere wäre ein i-Tüpfel 😉.
Mit der Reihenfolge wird wohl nicht klappen denn das ,,state/State" kommt immer vor den POWER Readings.

Was ich nochmal schauen könnte ob ich bei den Return 1&2 noch das State mit reinbekomme. Nach dem Motto wenn POWER3 ON und State nicht Stop. Aber das muss ich mir in Ruhe anschauen und mal ein paar Beispiele finden.😂😉
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 15:44:03
So wie hier in etwas

State { ReadingsVal("Leinwand","state",0) }, statePosition:(((POWER3|POWER4):.ON)|State:.Stop) {if((ReadingsVal("Leinwand","POWER3","") eq "ON") and (ReadingsVal("Leinwand","State","") ne "Stop")) {return 1} if ((ReadingsVal("Leinwand","POWER4","") eq "ON") and (ReadingsVal("Leinwand","State","") ne "Stop")) {return 2} if (ReadingVal("Leinwand","State","") eq "Stop") {return 3}}

Aber jetzt komm ich eine Fehler Meldung wenn ich Stop drücke.

Error evaluating Leinwand userReading statePosition: Undefined subroutine &main::ReadingVal called at (eval 45263) line 1.

Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Otto123 am 07 Juni 2020, 16:12:03
Meistens hat die Fehlermeldung Recht :)
ReadingVal  da fehlt ein s -> ReadingsVal - beim letzten Eintrag in deinem Code
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 18:14:28
🙄🙄😤😤😤🤨🤨🤨

Ich hab da bestimmt 5mal drüber gesehen. Aber dieses S ist mir nicht aufgefallen...

Genau so klappt es super vielen Danke

State { ReadingsVal("Leinwand","state",0) }, statePosition:(POWER3|POWER4):.ON|State:.Stop {if (ReadingsVal("Leinwand","POWER3","") eq "ON" && ReadingsVal("Leinwand","State","") ne "Stop") {return 1} if (ReadingsVal("Leinwand","POWER4","") eq "ON" && ReadingsVal("Leinwand","State","") ne "Stop") {return 2} if (ReadingsVal("Leinwand","State","") eq "Stop") {return 3}}
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Beta-User am 07 Juni 2020, 18:33:39
Nur als Idee: Schon mal drüber nachgedacht, die Shutter-Funktion an dem Tasmota-ESP zu aktivieren?

Kann aber sein, dass das nur geht, wenn die ersten beiden Relais dafür hergenommen werden (das attrTemplate geht jedenfalls dann nicht 1:1, aber das dürfte für nur ein Gerät auch leicht manuell anzupassen sein).
Titel: Antw:Userreading mehrer readings ein Status
Beitrag von: Freee84neu am 07 Juni 2020, 19:21:59
Hallo

Shutter-Funktion davon hab ich noch nix gehört. Müsste ich erstmal nachschauen was das genau ist ...🙂🙈

Also ich habe jetzt alles am laufen. Auch über HomeKit hier mal ein Auszug von meinem Device

Zitat
attr Leinwand  genericDeviceType blind

attr Leinwand homebridgeMapping clear CurrentPosition=Homebridgeposition,minValue=0,maxValue=100,minStep=50 TargetPosition=Homebridgeposition,minValue=0,maxValue=100,minStep=50,cmds=0:on4;;50:Stop;;100:on3

attr Leinwand userReadings State { ReadingsVal("$NAME","state",0) }, statePosition:(POWER3|POWER4):.ON|State:.Stop {if (ReadingsVal("$NAME","POWER3","") eq "ON" && ReadingsVal("$NAME","State","") ne "Stop") {return 1} if (ReadingsVal("$NAME","POWER4","") eq "ON" && ReadingsVal("$NAME","State","") ne "Stop") {return 2} if (ReadingsVal("$NAME","State","") eq "Stop") {return 3}}, Homebridgeposition {if (ReadingsVal($NAME,"statePosition","") eq "1") {return 100} if (ReadingsVal($NAME,"statePosition","") eq "2") {return 0} if (ReadingsVal($NAME,"statePosition","") eq "3") {return 50}}


Vielen Dank an alle die geholfen haben.