Hallo,
aktuell verzweifle ich ich bei einem userReading. Problem: das Reading wird nicht aktualisiert wenn das Reading aus dem Hautpdevice gesetzt wird, sondern erst wenn das Device, wo das userReading drin ist, geschaltet wird.
So ist das Device "Garagentor-Schalter" angelegt:
defmod EnO_01879635 EnOcean 01879635
attr EnO_01879635 IODev ESP3
attr EnO_01879635 alias Garagentor
attr EnO_01879635 devStateIcon .*:control_on_off
attr EnO_01879635 eventMap on-for-timer:on-for-timer BI:off B0:on
attr EnO_01879635 genericDeviceType garage
attr EnO_01879635 group Schaltaktor FSR61/8-24V UC
attr EnO_01879635 homebridgeMapping CurrentDoorState:Status,values=off:CLOSED;;on:OPEN TargetDoorState:CurrentDoorState,cmds=OPEN:on;;CLOSED:off
attr EnO_01879635 icon fts_garage
attr EnO_01879635 manufID 00D
attr EnO_01879635 room Garage,Homekit,Schaltschrank
attr EnO_01879635 stateFormat {ReadingsVal("EnO_FEFA7CE5","Status",0)}
attr EnO_01879635 subDef FFD6FC81
attr EnO_01879635 subType switch
attr EnO_01879635 switchMode pushbutton
attr EnO_01879635 userReadings Status { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";;} else {return "geschlossen";;} }
attr EnO_01879635 webCmd :
Das heißt, der Wert im Reading "Status" vom Garagentor-Schalter soll aus dem Reading "state" vom Device "EnO_FEFA7CE5" übernommen werden. Das passiert aber nicht wenn sich das reading im Device "EnO_FEFA7CE5" ändert, sondern erst wenn ich den Garagentor-Schalter mit on, off oder on-for-timer bediene. Scheinbar wird das Attribut "userreading" nur über den Garagentor-Schalter getriggert.
Hier noch der Code von dem Sensor "EnO_FEFA7CE5":
defmod EnO_FEFA7CE5 EnOcean FEFA7CE5
attr EnO_FEFA7CE5 IODev ESP3
attr EnO_FEFA7CE5 alias Garagentor Sensor oben
attr EnO_FEFA7CE5 eep F6-10-00
attr EnO_FEFA7CE5 eventMap pressed:offen released:geschlossen
attr EnO_FEFA7CE5 manufID 00D
attr EnO_FEFA7CE5 model Eltako_FTS12
attr EnO_FEFA7CE5 room Garage
attr EnO_FEFA7CE5 stateFormat { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";;} else {return "geschlossen";;} }
attr EnO_FEFA7CE5 subType switch
attr EnO_FEFA7CE5 teachMethod RPS
attr EnO_FEFA7CE5 userReadings Status { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";;} else {return "geschlossen";;} }
attr EnO_FEFA7CE5 webCmd :
Hat da vielleicht jemand eine Idee? Außer mit "do if" oder "notify"...
Oder läßt sich das wirklich nur mit "do if" oder "notify" umsetzen? :-(
Gruß, Sascha
userReadings werden nur im eigenen Device getriggert.
Wenn Du Werte von einem anderen Device in dem Device setzen willst, dann geht das nur über notify oder doif.
Gruß
Dan
Sollte man diesen Satz in der Doku optisch präsenter positionieren?
ZitatDiese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird.
Aber ein setreading auf ein ANDERES Device darf man doch in einem userReadings machen? Das wird zumindest nicht verhindert. Erzeugt ja auch keine Schleife.
Also im userReadings in EnO_FEFA7CE5 einfach ein setreading EnO_01879635 ... machen?
Hoffentlich verhaut mich jetzt keiner :)
Gruß Otto
ich hatte es auch so im Kopf und mir gedacht. Manchmal weiß man ja aber auch nicht immer was sich so getan hat.
Dennoch läuft es noch nicht so ganz. (Pearl und Klammern sind bei mir noch ein wenig hakelig.)
Das habe ich jetzt im userReading meines Sensors um das reading meines Schalters zu setzen:
{ if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") (setreading EnO_01879635 Status offen) else (setreading EnO_01879635 Status geschlossen) }
Gruß, Sascha
In deinem Fall geht das auch ohne viel Klammern.
Google "Perl ternärer Operator" im ersten Ergebnis wird der beschrieben und auch die korrekte Syntax zu deinem jetzigem if/else.
Gruß
Thomas
Danke, aber so recht hat mir das nicht weiter geholfen oder ich habe einen falschen Beitrag gelesen. Vielleicht wäre ja dennoch jemand so nett mir den richtigen Ansatz zu geben.
Ich verstehe, daß manch einer möchte, daß sich die User mit dem Thema auseinandersetzen und lieber Lesetips geben. Allerdings bin ich jetzt nicht erst seit gestern hier, beschäftige mich selbst ersteinmal mit meinen Problemen und schreibe wenn ich selbst nicht mehr weiter weiß. Umso mehr freut man sich wenn jemand einem aktiv hilft - das mache ich andersrum genauso bei Themen bei denen ich helfen kann.
Gruß, Sascha
Zitat von: Cybers am 04 März 2021, 18:22:17
Danke, aber so recht hat mir das nicht weiter geholfen oder ich habe einen falschen Beitrag gelesen. Vielleicht wäre ja dennoch jemand so nett mir den richtigen Ansatz zu geben.
Ich verstehe, daß manch einer möchte, daß sich die User mit dem Thema auseinandersetzen und lieber Lesetips geben. Allerdings bin ich jetzt nicht erst seit gestern hier, beschäftige mich selbst ersteinmal mit meinen Problemen und schreibe wenn ich selbst nicht mehr weiter weiß. Umso mehr freut man sich wenn jemand einem aktiv hilft - das mache ich andersrum genauso bei Themen bei denen ich helfen kann.
Gruß, Sascha
Er meint wohl so:
{ ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed" ? (setreading EnO_01879635 Status offen) : (setreading EnO_01879635 Status geschlossen) }
Gruß
Dan
funktioniert doch nicht ohne fhem("") ???
{ ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
Danke, aber da scheint immer noch etwas nicht ganz zu passen. Das Reading wird nicht gesetzt.
defmod EnO_FEFA7CE5 EnOcean FEFA7CE5
attr EnO_FEFA7CE5 IODev ESP3
attr EnO_FEFA7CE5 alias Garagentor Sensor oben
attr EnO_FEFA7CE5 eep F6-10-00
attr EnO_FEFA7CE5 eventMap pressed:offen released:geschlossen
attr EnO_FEFA7CE5 manufID 00D
attr EnO_FEFA7CE5 model Eltako_FTS12
attr EnO_FEFA7CE5 room Garage
attr EnO_FEFA7CE5 stateFormat { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";;} else {return "geschlossen";;} }
attr EnO_FEFA7CE5 subType switch
attr EnO_FEFA7CE5 teachMethod RPS
attr EnO_FEFA7CE5 userReadings { ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
attr EnO_FEFA7CE5 webCmd :
weil da der Name des Userreading fehlt!
attr EnO_FEFA7CE5 userReadings { ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
Von mir aus Willi :)
attr EnO_FEFA7CE5 userReadings willi { ReadingsVal($name,"state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
Hat das gerät noch etwas Besseres als state worauf man triggern könnte? So rammelt das userReadings bei jeder Änderung im state los und state selbst steht wieder nicht im event :(
Zitat von: Otto123 am 04 März 2021, 18:42:53
funktioniert doch nicht ohne fhem("") ???
Die Syntax sah mir so nach doif oder sowas aus!
Und da ich mich damit nicht auskenne, habe ich es einfach so gelassen. ;)
Gruß
Dan
Danke für eure Hilfe, jetzt läuft es! Der Name des Userreadings ist mir beim letzten Einfügen "verloren" gegangen. :-[
Alternativ könnte man noch auf das Reading "buttons" triggern.
Hier mal ein list von dem Device:
Internals:
DEF FEFA7CE5
ESP3_DestinationID FFFFFFFF
ESP3_MSGCNT 25
ESP3_PacketType 1
ESP3_RSSI -91
ESP3_ReceivingQuality bad
ESP3_RepeatingCounter 0
ESP3_SubTelNum 3
ESP3_TIME 2021-03-04 19:05:34
FGW14_USB_MSGCNT 24
FGW14_USB_TIME 2021-03-04 19:05:34
FUUID 5c473d3a-f33f-e675-bdcb-dc8782697288bbe9
IODev ESP3
LASTInputDev FGW14_USB
MSGCNT 25
NAME EnO_FEFA7CE5
NR 556
NTFY_ORDER 50-EnO_FEFA7CE5
STATE offen
TYPE EnOcean
OLDREADINGS:
READINGS:
2021-03-04 19:05:34 buttons pressed
2021-03-04 19:05:34 state pressed
2018-07-11 20:36:37 teach RPS teach-in accepted EEP F6-10-00 Manufacturer: no ID
helper:
Attributes:
IODev ESP3
alias Garagentor Sensor oben
eep F6-10-00
eventMap pressed:offen released:geschlossen
manufID 00D
model Eltako_FTS12
room Garage
stateFormat { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";} else {return "geschlossen";} }
subType switch
teachMethod RPS
userReadings Status { ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
webCmd :
Besser !
buttons pressed
Wahrscheinlich so? ;)
attr EnO_FEFA7CE5 userReadings Status:buttons:.* { ReadingsVal($name,"buttons",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
Zitatbeschäftige mich selbst ersteinmal mit meinen Problemen
Mein Ebus-Raspi liegt seit mehr als 2 Jahren provisorisch mit 2 verdrillten Adern angeschlossen auf meinem Heizkessel, heute war der Tag an dem ich neue Leitungen (230V Leitung für Steckdose und Ebusleitung) sauber verlegt/installiert habe, neben meiner eigentlichen Arbeit und meinen Problemen.
In einer 5-minütigen Pause hab ich dir geantwortet, habs nur gut gemeint und kurz helfen wollen.
Zitat von: TomLee am 04 März 2021, 19:28:32
Mein Ebus-Raspi liegt seit mehr als 2 Jahren provisorisch mit 2 verdrillten Adern angeschlossen auf meinem Heizkessel, heute war der Tag an dem ich neue Leitungen (230V Leitung für Steckdose und Ebusleitung) sauber verlegt/installiert habe, neben meiner eigentlichen Arbeit und meinen Problemen.
In einer 5-minütigen Pause hab ich dir geantwortet, habs nur gut gemeint und kurz helfen wollen.
Meine Antwort war auch nicht böse gemeint. Ich lerne ja auch immer gerne dazu und bin auch lesewillig. :)
Zitat von: Otto123 am 04 März 2021, 19:17:56
Besser !
buttons pressed
Wahrscheinlich so? ;)
attr EnO_FEFA7CE5 userReadings Status:buttons:.* { ReadingsVal($name,"buttons",0) eq "pressed" ? fhem("setreading EnO_01879635 Status offen") : fhem("setreading EnO_01879635 Status geschlossen") }
Da das Reading ,,buttons" entweder released oder pressed ist, habe ich es in .* geändert.
Gerade gesehen, dass du es auch geändert hast. :)
Danke noch mal! Jetzt muss ich nur noch hinbekommen, dass Homebridge den Status richtig anzeigt...
"Perl ternärer Operator" - ein gewaltiger Begriff für ein Fragezeichen und einen Doppelpunkt. Ich bin da kurz versunken als ich den das erste Mal las. ;D
ternär -> "aus drei Grundeinheiten bestehend" - ah ja - Bedingung ? wahr : falsch
Es geht also gar nicht um Fragezeichen und Doppelpunkt ;D ;D ;D
ZitatDa das Reading ,,buttons" entweder released oder pressed ist, habe ich es in .* geändert.
Ja das war mir nach dem Schreiben auch kurz klar geworden ;)
jetzt habe ich dazu noch eine kleine Ergänzung. Ich möchte, daß zwei Befehle zeitverzögert nacheinander ausgeführt werden. Ich habe das Attribut wie folgt geändert:
attr EnO_FEFA7CE5 userReadings Status { ReadingsVal($name,"state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status 0") : fhem("setreading EnO_01879635 Status 3;sleep 20;setreading EnO_01879635 Status 1") }
Leider klappt die Zeitverzögerung nicht. Was habe ich da falsch gemacht.
So wie Du es schreibst ist es der Befehl in der Kommandozeile, da musst Du die ; doppelt schreiben!
attr EnO_FEFA7CE5 userReadings Status { ReadingsVal($name,"state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status 0") : fhem("setreading EnO_01879635 Status 3;;sleep 20;;setreading EnO_01879635 Status 1") }
Das hatte ich auch schon versucht. Dann wird folgendes in das Reading geschrieben:
3;sleep 20;setreading EnO_01879635 Status 1
Bei mir klappt das setreading (in ein anderes Device, wie du es machst) genauso wie du es als erstes gezeigt hast mit nur einem ;
was { ReadingsVal($name,"state",'0') eq "on" ? fhem("setreading Pflanze1 test 0") : fhem("setreading Pflanze1 test 3;sleep 8;setreading Pflanze1 test 2") }
Zeig doch einfach mal ein List, vlt. entgeht dir irgendwas.
Am Besten lists von beiden Devices!
In diesem Device soll das Reading ,,Status" gesetzt werden:
Internals:
DEF 01879635
ESP3_DestinationID FFFFFFFF
ESP3_MSGCNT 13
ESP3_PacketType 1
ESP3_RSSI -91
ESP3_ReceivingQuality bad
ESP3_RepeatingCounter 0
ESP3_SubTelNum 3
ESP3_TIME 2021-03-24 19:10:28
FGW14_USB_MSGCNT 10
FGW14_USB_TIME 2021-03-24 19:10:28
FUUID 602e83fa-f33f-e675-eb0b-4cbb533670b88559
IODev ESP3
LASTInputDev ESP3
MSGCNT 13
NAME EnO_01879635
NR 361
NTFY_ORDER 50-EnO_01879635
STATE 3;sleep 20;setreading EnO_01879635 Status 1
TYPE EnOcean
CHANGED:
Status: 3;sleep 20;setreading EnO_01879635 Status 1
READINGS:
2021-03-24 19:10:28 Status 3;sleep 20;setreading EnO_01879635 Status 1
2021-03-24 19:10:28 buttons pressed
2021-03-24 19:10:28 channelB BI
2021-03-24 19:10:28 state BI
helper:
Attributes:
IODev ESP3
alias Garagentor
devStateIcon open:fts_garage closed:fts_garage_door_100
eventMap on-for-timer:on-for-timer BI:off B0:on
genericDeviceType garage
group Schaltaktor FSR61/8-24V UC
homebridgeMapping CurrentDoorState=Status,values=1:CLOSED;0:OPEN TargetDoorState=Status,values=1:CLOSED;0:OPEN,cmds=OPEN:on;CLOSED:on
icon fts_garage
manufID 00D
room Garage,Homekit,Schaltschrank
stateFormat {ReadingsVal("EnO_01879635","Status",0)}
subDef FFD6FC81
subType switch
switchMode pushbutton
webCmd :
dieses Device soll über das Attribut usereadings beim obigen Device das Reading ,,Status" setzen:
Internals:
DEF FEFA7CE5
ESP3_DestinationID FFFFFFFF
ESP3_MSGCNT 4
ESP3_PacketType 1
ESP3_RSSI -85
ESP3_ReceivingQuality good
ESP3_RepeatingCounter 0
ESP3_SubTelNum 3
ESP3_TIME 2021-03-24 19:10:28
FGW14_USB_MSGCNT 4
FGW14_USB_TIME 2021-03-24 19:10:28
FUUID 5c473d3a-f33f-e675-bdcb-dc8782697288bbe9
IODev ESP3
LASTInputDev ESP3
MSGCNT 4
NAME EnO_FEFA7CE5
NR 600
NTFY_ORDER 50-EnO_FEFA7CE5
STATE geschlossen
TYPE EnOcean
OLDREADINGS:
READINGS:
2021-03-24 19:10:28 buttons released
2021-03-24 19:10:28 state released
2018-07-11 20:36:37 teach RPS teach-in accepted EEP F6-10-00 Manufacturer: no ID
helper:
Attributes:
IODev ESP3
alias Garagentor Sensor oben
eep F6-10-00
eventMap pressed:offen released:geschlossen
manufID 00D
model Eltako_FTS12
room Garage
stateFormat { if(ReadingsVal("EnO_FEFA7CE5","state",0) eq "pressed") {return "offen";} else {return "geschlossen";} }
subType switch
teachMethod RPS
userReadings Status { ReadingsVal($name,"state",0) eq "pressed" ? fhem("setreading EnO_01879635 Status 0") : fhem("setreading EnO_01879635 Status 3;sleep 20;setreading EnO_01879635 Status 1") }
webCmd :
zwei semikolon sind im List /DEF definitiv falsch!
Ich hatte von der Kommandozeile gesprochen!
Geht kürzer:
stateFormat Status
Zwei ee aber nur ein Semikolon ?
Zitat2021-03-24 09:53:48 Status Unknown command slep, try help.
das eine fehlende ,,e" war ein anfänglicher Schreibfehler. Da kam auch noch das Reading her. Ich habe in meinem letzten Post ein paar Dinge geändert. Vielleicht schaust du da noch mal rein. Mit einem ,,;" hatte ich ja auch schon, klapp leider nicht. Sleep wir nicht ausgeführt. Die Beiden Werte ,,3" und ,,1" werden direkt nacheinander gesetzt.
Damit es Prinzipiell nachgestellt werden kann:
defmod D1 dummy
attr D1 room TestD
attr D1 stateFormat Status
defmod D2 dummy
attr D2 room TestD
attr D2 setList pressed no
attr D2 userReadings Status { ReadingsVal($name,"state",0) eq "pressed" ? fhem("setreading D1 Status 0") : fhem("setreading D1 Status 3;;sleep 5;;setreading D1 Status 1") }
Was nicht schön ist:
userReadings Status hat keinen Trigger! Wird also einfach bei jedem Event getriggert! Weiß nicht ob daher das Problem kommt?
Es wird state verwendet, state kommt im Event nicht vor und kann deshalb nicht als Trigger verwendet werden.
Ich hatte schon empfohlen:
attr userReadings Status:buttons:.pressed ...
Versuch es damit. ;)