FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: theotherhalf am 26 November 2020, 10:31:21

Titel: Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 10:31:21
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?
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 10:41:06
$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 !!!!)
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 10:53:37
Ich hänge mal ein bischen mehr Input an...
Einerseits den ReadingsProxy und dann noch den Velux Kanal.
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 10:56:43
Bitte Text, screenshots will sich keiner ansehen...
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 10:58:25
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
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 10:59:49
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
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 11:01:03
Ä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
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 11:04:22
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...
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 11:13:39
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?
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 11:18:24
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 ;) ).
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 11:44:25
Du meinst so?
define Emil_Velux_Rolladen_Verfahren notify Rolladen_Velux_Virtuell 6.LEVEL set Velux var Rolladen_Velux_Emil pct $EVTPART6
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 12:02:49
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
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 12:55:27
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?
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 13:00:55
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
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 13:53:51
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.
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 13:59:44
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") }
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 15:05:06
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") }


Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 15:08:13
Jein. Für die Kommandzeile musst du das ";" "escapen", also verdoppeln. Desegen hatte ich oben geschrieben: Für die Bearbeitung in DEF...
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 15:21:19
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.
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 15:24:08
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?
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 15:33:14
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?
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 26 November 2020, 15:36:18
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") }
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: theotherhalf am 26 November 2020, 15:46:16
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.
Titel: Antw:Zuweisen eines Wertes auf einen anderen per nofify
Beitrag von: Beta-User am 27 November 2020, 07:55:03
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).