Ich bin mit Perl wirklich nicht bewandert, habe aber bereits einiges was ähnelt in meiner Config und hoffe ihr könnt mir weiter helfen.
Ich habe 6 Velux Rolläden, die ich über die Homematic steuern möchte.
Dazu habe ich in der Homematic 6 virtuelle Jalousietaster angelegt. Diese Werte liegen mir jetzt als 6 einzelne readingsProxy vor. Sie kommen als float an und sind von 0-1 skaliert.
Nun möchte ich über ein notify, nämlich wenn der Wert sich ändert, diesen in das entsprechende Register "pcs" des Velux Rolladens schieben. DAs Device "Velux" ist das KLF200 Interface des Herstellers.
Im ersten Schritt geht es mir erstmal um die korrekte Zuweisung:
{ my $MLEVEL1 = ReadingsVal("Rolladen_Velux_xxxx_Sollwert_von_CCU","state","");; fhem "set Velux var Rolladen_Velux_xxxx $MLEVEL1"}
Wird dann hinter den Namen "Rolladen_Velux_xxxx"der Wert mit :pcs angehängt?
$MLEVEL1 würde vermutlich schon zugewiesen, die Konstruktion wird aber eher nicht funktionieren und ist m.E. auch unnötig kompliziert...
Insgesamt ist aber nicht so richtig zu erkennen, worauf denn das notify reagiert/reagieren soll und wohin der readingsProxy "zeigt". M.E. sollte er sinnvollerweise auf den Velux-Kanal zeigen (?).
Das notify dagegen soll/darf nicht auf den readingsProxy hören (schau mal in den Event-Monitor, dann sollte klarer werden, warum). Es ist daher vermutlich einfacher, das notify auf den "Rolladen_Velux_xxxx_Sollwert_von_CCU" hören zu lassen und dann direkt $EVTPARTx (x=vermutlich 1) zu verwenden, so dass dann der Ausführungsteil sich auf das hier beschränkt:
set Velux var Rolladen_Velux_xxxx $EVTPART1
Mehr Hilfe? => Mehr input (list !!!!)
Ich hänge mal ein bischen mehr Input an...
Einerseits den ReadingsProxy und dann noch den Velux Kanal.
Bitte Text, screenshots will sich keiner ansehen...
ReadingsProxy:
DeviceOverview
Rolladen_Velux_Emil_Sollwert_von_CCU
0.400000
Internals
DEF
Rolladen_Velux_Virtuell:6.LEVEL
DEVICE
Rolladen_Velux_Virtuell
FUUID
5fb8448d-f33f-0f31-f1a5-c9d885bef8f46858
NAME
Rolladen_Velux_Emil_Sollwert_von_CCU
NOTIFYDEV
global,Rolladen_Velux_Virtuell
NR
264
NTFY_ORDER
50-Rolladen_Velux_Emil_Sollwert_von_CCU
READING
6.LEVEL
STATE
0.400000
TYPE
readingsProxy
Readings
state
0.400000
2020-11-26 10:55:40
Velux Device:
DeviceOverview
Rolladen_Velux_Emil
Rolladen_Velux_Emil
Internals
DEF
192.168.178.31:51200 0
DeviceName
192.168.178.31:51200
FUUID
5f9e3570-f33f-0f31-4dfc-58e961945adcd652
IODev
Velux
LASTInputDev
Velux
MSGCNT
5
NAME
Rolladen_Velux_Emil
NR
251
NodeID
0
STATE
100 stop
TYPE
KLF200Node
Velux_MSGCNT
5
Velux_TIME
2020-11-26 10:52:52
Readings
MP
0
2020-11-26 10:52:51
MPtarget
0
2020-11-26 10:52:51
actuatorAddress
778c0f
2020-11-01 06:33:00
backboneReferenceNumber
000000
2020-11-01 06:33:00
buildNumber
19
2020-11-01 06:32:59
execution
stop
2020-11-25 10:58:41
ioManufacturer
VELUX
2020-11-01 06:33:00
lastCommandOriginator
SAAC
2020-11-22 13:54:11
lastControl
FHEM
2020-11-22 13:54:11
lastMasterExecutionAddress
ca0a83
2020-11-22 13:54:11
lastRunStatus
EXECUTION COMPLETED
2020-11-25 10:58:41
lastStatusReply
COMMAND COMPLETED OK
2020-11-07 21:00:10
model
VELUX SSL Roller Shutter
2020-11-01 06:33:00
name
Emil Rollo
2020-11-01 06:32:59
nodeTypeSubType
Roller Shutter
2020-11-01 06:33:00
nodeVariation
NOT SET
2020-11-01 06:32:59
operatingState
Done
2020-11-25 10:58:41
pct
100
2020-11-25 10:58:41
powerMode
LOW POWER MODE
2020-11-01 06:32:59
productCode
SSL
2020-11-01 06:33:00
productGroup
1
2020-11-01 06:32:59
productType
5
2020-11-01 06:32:59
production
2017 week 9
2020-11-01 06:32:59
remaining
0
2020-11-25 10:58:41
serial
83 2368 90 17 9 1978
2020-11-01 06:32:59
sessionID
462
2020-11-26 10:52:52
sessionInformationCode
20000500
2020-11-25 10:58:41
sessionStatusOwner
USER
2020-11-25 14:59:57
state
on
2020-11-25 10:58:41
target
100
2020-11-25 10:57:56
targetArrival
2020-11-25 10:58:37
2020-11-25 10:57:58
velocity
Not supported
2020-11-01 06:32:59
Ändere ich den Wert in der Homematic, dann erhalte ich ein Event:
2020-11-26 11:00:24 readingsProxy Rolladen_Velux_Emil_Sollwert_von_CCU 0.700000
MMn. brauchst du den readingsProxy nicht, der irritiert nur. Reagiere direkt auf den Event mit "Rolladen_Velux_Virtuell:6.LEVEL", und greife da dann den betreffenden $EVTPARTx, wie bereits geschrieben, ganz unabhängig davon, ob der rP einen Event wirft oder nicht. Es ist (m.E.) doppelt gemoppelt, und du willst ja eigentlich den virtuellen Wert nur irgendwie an den eigentlichen Adressaten (Velux_xy) weitergeben, oder habe ich das falsch verstanden?
Ansonsten bitte mal mit "list" beschäftigen, das gibt einen besseren output wie den Text aus dem Device-Overview rauszukopieren...
Das stimmt, ich will den eigentlich nur zuweisen.
Wie wäre denn der korrekte String für die Zuweisung falls ich den readingsproxy umgehen würde, also quasi Direktverbindung?
Versuch bitte erst mal mit dem Event-Monitor (https://wiki.fhem.de/wiki/Event_monitor) selbst, ein passendes notify zu basteln; der bereits gepostete Ausführungsteil sollte eigentlich passen. Bitte vorab aber testen, ob der Velux die vielen Stellen hinter dem Komma akzeptiert, oder ob man doch was umformatieren muss (Perl-sprintf, falls du das selbst lösen willst ;) ).
Du meinst so?
define Emil_Velux_Rolladen_Verfahren notify Rolladen_Velux_Virtuell 6.LEVEL set Velux var Rolladen_Velux_Emil pct $EVTPART6
Fast. Device und der Rest sollten durch einen Doppelpunkt getrennt sein, und das Event darf weder Leerzeichen enthalten, noch nur Teile vom gesamten Event. Also eher so (aber $EVTPART6? Das kommt mir hoch vor...):
define Emil_Velux_Rolladen_Verfahren notify Rolladen_Velux_Virtuell:6.LEVEL.* set Velux var Rolladen_Velux_Emil pct $EVTPART6
Habe es jetzt so stehen und es scheint zu funktionieren:
define Emil_Velux_Rolladen_Verfahren notify Rolladen_Velux_Virtuell:6.LEVEL.* set Velux var Rolladen_Velux_Emil pct $EVENT
Leider wird der Wert nicht durchgereicht. Ich habe es richtig verstanden, das beim entsprechenden Event der Wert von *.LEVEL6 auf pct kopiert wird, richtig?
In der Homematic ist der Wert dezimal 0-100%, sodaß ich davon ausgehe, das die 0,1...1,0 im Reading von *.LEVEL6 die Zahl als float dargestellt ist, oder? Sollte ich die dann mit 100 multiplizieren und die Dezimalstellen abschneiden? Oder wie sollte das Durchreichen aussehen?
Bitte lies dich mal ein wenig ein. $EVENT beinhaltet hier auch den Readingnamen, den brauchst du nicht, weswegen mein Vorschlag auch $EVTPART1 war, was wahrscheinlich paßt. Dazu schreibst du aber nichts... (=> wie soll ich das deuten? Getestet und verworfen, überlesen, ...?)
Siehe dazu insgesamt nochmal:
Zitat von: Beta-User am 26 November 2020, 11:18:24
...der bereits gepostete Ausführungsteil sollte eigentlich passen. Bitte vorab aber testen, ob der Velux die vielen Stellen hinter dem Komma akzeptiert, oder ob man doch was umformatieren muss (Perl-sprintf, falls du das selbst lösen willst ;) ).
Und falls nicht klar ist, was mit "Ausführungsteil" gemeint ist: Das Wiki spricht von "Anweisung", https://wiki.fhem.de/wiki/Notify#Anweisung
Sorry, das hatte ich noch falsch kopiert, natürlich muss es "$EVTPART1" sein. Das notify klappt auch. Vielen Dank für deine Hilfe!
Allerdings habe ich eben mal händisch getestet ob ich Werte direkt auf pct mit "Set" geben kann. Scheinbar ist das nicht der richtige Weg, da muss ich mich noch im Velux Threas einlesen. Ich bin auch nicht zu Hause, sondern arbeite aus der Ferne.
Eventuell kannst du auch über die HMCCU.*-Module irgendwie einstellen, wie das Event formatiert wird, sonst ist "0.70000" aber eben auch nicht "70", und du must in die Richtung gehen, wie das am Anfang war (aber weiter ohne den Umweg über readingsProxy).
In Etwa also so für den Ausführungsteil (Notation für DEF-Bearbeitung):
{ my $MLEVEL1 = $EVTPART1*100; fhem("set Velux var Rolladen_Velux_xxxx $MLEVEL1") }
Im HMCCU Modul kann ich leider mit stateFormat nur einmal arbeiten und ich habe im Modul ja 6 Readings heraus gefiltert. Denke, es wäre im Notify gut aufgehoben.
So in etwa wäre es dann?
define Rolladen_Velux_Emil_verfahren notify Rolladen_Velux_Virtuell:6.LEVEL.* { my $MLEVEL1 = $EVTPART1*100; fhem("set Velux var Rolladen_Velux_Emil $MLEVEL1") }
Jein. Für die Kommandzeile musst du das ";" "escapen", also verdoppeln. Desegen hatte ich oben geschrieben: Für die Bearbeitung in DEF...
In DEF steht nun:
Rolladen_Velux_Virtuell:6.LEVEL.* { my $MLEVEL1 = $EVTPART1*100; fhem("set Velux var Rolladen_Velux_Emil $MLEVEL1") }
Leider geht das Kommando nicht durch...
Habe eben getestet ob es an der Anzahl der Dezimalstellen liegt aber scheinbar ist dem Modul das egal.
Probiere ich:
set Rolladen_Velux_Emil pct 20.0000
dann fährt die Jalousie wie sie soll.
na ja, das fhem("...")-Kommando im notify sollte dann schon in der Struktur mit dem übereinstimmen, was die Kommandozeile akzeptiert ::) .
Bekommst du das alleine zusammengeschustert?
Ich habe es ja so in die Kommandozeile eingegeben und es wurde akzeptiert...
define Rolladen_Velux_Emil_verfahren notify Rolladen_Velux_Virtuell:6.LEVEL.* { my $MLEVEL1 = $EVTPART1*100;; fhem("set Velux var Rolladen_Velux_Emil $MLEVEL1") }
Um ehrlich zu sein bin ich etwas ratlos. Alleine komme ich nicht weiter. Kannst Du da nochmals drüber schauen?
Zitat von: theotherhalf am 26 November 2020, 15:21:19
Probiere ich:
set Rolladen_Velux_Emil pct 20.0000
dann fährt die Jalousie wie sie soll.
Ergo muss doch genau "set Rolladen_Velux_Emil pct NN" in den Ausführungsteil, und nicht irgendwas anderes, das du hier irgendwann mal gepostet hattest (und ich daher als prinzipiell funktionierend unterstellt hatte) ...
Mach dann das hier für die Ratlosen unter uns :o :
define Rolladen_Velux_Emil_verfahren notify Rolladen_Velux_Virtuell:6.LEVEL.* { my $MLEVEL1 = $EVTPART1*100;; fhem("set Rolladen_Velux_Emil pct $MLEVEL1") }
Ups, natürlich, das pct hat gefehlt..... :o
Den Ausdruck am Anfang hatte ich nicht getestet, das war mehr ein erster Entwurf.
Danke für Deine Hilfe! Jetzt klappt es auch.
Danke für die Rückmeldung.
Kannst du dann bitte den Thread als [gelöst] markieren und in den Anfängerbereich verschieben? Das hat nur sehr am Rande was mit "Homematic" zu tun...
(Wie beides geht, steht in den angepinnten Beiträgen im Anfängerbereich, und ja: du kannst das selbst verschieben).