Danke für die schnelle Antwort. Angepasst muss vermutlich nur der function node in den Zeilen 9 und 10_
Code: Alles auswählen
Netzbezug = Math.round(msg.payload.readUInt32BE(32)/10);
Netzeinspeisung = Math.round(msg.payload.readUInt32BE(52)/10);
Moderator: Co-Administratoren
Danke für die schnelle Antwort. Angepasst muss vermutlich nur der function node in den Zeilen 9 und 10_
Code: Alles auswählen
Netzbezug = Math.round(msg.payload.readUInt32BE(32)/10);
Netzeinspeisung = Math.round(msg.payload.readUInt32BE(52)/10);
Code: Alles auswählen
# /usr/local/addons/cuxd/extra/socat -x -u -T 2 -t 2 UDP4-RECV:9522,ip-add-membership=239.12.255.254:0.0.0.0 STDOUT & pid=$! ; slee
p 2 && kill $pid
> 2020/07/04 20:45:55.944516 length=600 from=0 to=599
53 4d 41 00 00 04 02 a0 00 00 00 01 02 44 00 10 60 69 01 0e 71 42 c3 9c d0 34 1b 76 00 01 04 00 00 00 1b d7 00 01 08 00 00 00 00 05
d4 00 23 a8 00 02 04 00 00 00 00 00 00 02 08 00 00 00 00 06 dc 05 01 f8 00 03 04 00 00 00 00 00 00 03 08 00 00 00 00 00 bd 54 67 e0
00 04 04 00 00 00 08 c1 00 04 08 00 00 00 00 03 72 18 cf c0 00 09 04 00 00 00 1d 2f 00 09 08 00 00 00 00 06 c2 e2 0e a0 00 0a 04 00
00 00 00 00 00 0a 08 00 00 00 00 07 26 92 73 90 00 0d 04 00 00 00 03 ba 00 15 04 00 00 00 0b 2e 00 15 08 00 00 00 00 01 3e a3 0a b8
00 16 04 00 00 00 00 00 00 16 08 00 00 00 00 09 57 4f 9c 68 00 17 04 00 00 00 00 00 00 17 08 00 00 00 00 01 05 5b 4f 40 00 18 04 00
00 00 01 9f 00 18 08 00 00 00 00 00 9d 52 68 20 00 1d 04 00 00 00 0b 4c 00 1d 08 00 00 00 00 01 62 64 b6 90 00 1e 04 00 00 00 00 00
00 1e 08 00 00 00 00 09 78 4b db 48 00 1f 04 00 00 00 05 e2 00 20 04 00 00 03 77 b6 00 21 04 00 00 00 03 de 00 29 04 00 00 00 06 ea
00 29 08 00 00 00 00 04 2f 2f c8 20 00 2a 04 00 00 00 00 00 00 2a 08 00 00 00 00 00 00 00 00 00 00 2b 04 00 00 00 00 00 00 2b 08 00
00 00 00 00 01 ff be 40 00 2c 04 00 00 00 02 6a 00 2c 08 00 00 00 00 01 05 40 1a 18 00 31 04 00 00 00 07 53 00 31 08 00 00 00 00 04
77 a6 f3 08 00 32 04 00 00 00 00 00 00 32 08 00 00 00 00 00 00 00 00 00 00 33 04 00 00 00 03 90 00 34 04 00 00 03 80 94 00 35 04 00
00 00 03 b0 00 3d 04 00 00 00 09 bf 00 3d 08 00 00 00 00 02 e1 77 e9 d8 00 3e 04 00 00 00 00 00 00 3e 08 00 00 00 00 00 00 00 00 00
00 3f 04 00 00 00 00 00 00 3f 08 00 00 00 00 00 0b 6c f0 88 00 40 04 00 00 00 04 b8 00 40 08 00 00 00 00 02 24 f9 e2 48 00 45 04 00
00 00 0a d4 00 45 08 00 00 00 00 03 cd cc ae e0 00 46 04 00 00 00 00 00 00 46 08 00 00 00 00 00 00 00 00 00 00 47 04 00 00 00 05 18
00 48 04 00 00 03 80 b8 00 49 04 00 00 00 03 84 90 00 00 00 01 02 04 52 00 00 00 00
SMA▒D`iqBÜ▒▒#▒▒Tgr▒▒ / ▒▒▒
&▒s▒
>▒
▒ WO▒[O@▒Rh
bd▒▒ xK▒H▒ w▒!▒)▒//▒ *+▒▒@,j@1Sw▒23▒4▒▒5▒= ▒▒w▒▒>??
l▒@▒$▒▒HE
▒▒̮▒FGH▒▒I▒▒RPuTTYPuTTYPuTTYPuTTYPuTTYPuTTY> 2020/07/04 20:45:56.943663 length=600 from=600 to=1199
53 4d 41 00 00 04 02 a0 00 00 00 01 02 44 00 10 60 69 01 0e 71 42 c3 9c d0 34 1f 5d 00 01 04 00 00 00 1c
Code: Alles auswählen
system.Exec("/usr/local/addons/cuxd/extra/socat -x -u -T 2 -t 2 UDP4-RECV:9522,ip-add-membership=239.12.255.254:0.0.0.0 /dev/null 2>&1 & pid=$! ; sleep 1 && kill -9 $pid",&lGetOut,&lGetErr);
Code: Alles auswählen
string lGetOut = "";
string lGetErr = "";
system.Exec("/usr/local/addons/cuxd/extra/socat -x -u -T 2 -t 2 UDP4-RECV:9522,ip-add-membership=239.12.255.254:0.0.0.0 /dev/null 2>&1 & pid=$! ; sleep 1 && kill -9 $pid",&lGetOut,&lGetErr);
string serial = lGetOut.StrValueByIndex(" ", 7+20) # lGetOut.StrValueByIndex(" ", 7+21) # lGetOut.StrValueByIndex(" ", 7+22) # lGetOut.StrValueByIndex(" ", 7+23);
system.Exec("printf '%d' 0x" # serial, &serial, &lGetErr);
string netzbezug = lGetOut.StrValueByIndex(" ", 39) # lGetOut.StrValueByIndex(" ", 40) # lGetOut.StrValueByIndex(" ", 41) # lGetOut.StrValueByIndex(" ", 42);
system.Exec("printf '%d' 0x" # netzbezug, &netzbezug, &lGetErr);
netzbezug = netzbezug.ToInteger() / 10;
string netzeinspeisung = lGetOut.StrValueByIndex(" ", 59) # lGetOut.StrValueByIndex(" ", 60) # lGetOut.StrValueByIndex(" ", 61) # lGetOut.StrValueByIndex(" ", 62);
system.Exec("printf '%d' 0x" # netzeinspeisung, &netzeinspeisung, &lGetErr);
netzeinspeisung = netzeinspeisung.ToInteger() / 10;
WriteLine(serial);
WriteLine(netzbezug);
WriteLine(netzeinspeisung);
if ( ( netzbezug + netzeinspeisung ) > 0 ) {
dom.GetObject("EM Netzbezug").State(netzbezug);
dom.GetObject("EM Netzeinspeisung").State(netzeinspeisung);
dom.GetObject("EM Zeitstempel").State(system.Date("%H:%M:%S"));
}
WriteLine("Hello world!");
Das hier beschrieben Skript funktioniert unter meiner CCU3 mit dem Button "Skript testen" tadellos. Die Werte werden aus meinem Sunny Home Manager 2.0 einwandfrei ausgegeben. Sobald ich damit aber ein neues Programm machen will, kommt lediglich beim Testen des Skriptes "Hello World". Gibt es eine Beschreibung, wo man dies mit einem CCU3 Zentralen-Programm verbindet (ohne Zusatzsoftware wie CUxD), oder sonst irgendwie für seine Hausautomation einsetzen kann?mschneider hat geschrieben: ↑12.01.2019, 15:57Ich habe eine Photovoltaik Anlage (PV) und auch einen SMA Home Manager 2 (SHM2) installiert. Nun würde ich gerne in meiner CCU3 Verbraucher abhängig vom Netzbezug oder der Netzeinspeisung steuern. Bisher habe ich noch keine zufriedenstellende Lösung gefunden.
Das SMA Energy Meter als auch der SHM2 senden jede Sekunde eine UDP Broadcast Telegramm in das Netzwerk. Hier nun ein Skript das einige Werte (Seriennummer, gesamte Einspeisung und gesamten Netzbezug aller 3 Phasen) liest und in Variablen der CCU schreibt. (Man kann noch viel mehr Daten lesen wenn man möchte).
Voraussetzung:
1) CCU3 und SHM2 oder Energy Meter im Netzwerk mit Switch verbunden. (Nicht über Router/Fritzbox da diese(r) Broadcast Telegramme wegfiltern). Der Switch kann natürlich mit einem Router verbunden werden.
2) Damit die CCU3 die Broadcast Telegramme auch empfangen kann, muss in der CCU folgendes eingestellt werden: Settings->Control Panel->Configure Firewall: Firewall Policy: Ports open.
3) Diese variablen in der CCU3 anlegen:
"EM Netzbezug", Zahl, 0..65000, Watt
"EM Netzeinspeisung", Zahl, 0..65000, Watt
"EM Zeitstempel", Zeichenkette, Uhr
4) Das folgene Skript ausführen oder so einstellen das es z.B. jede Minute ausgeführt wird.
SHM2 CCU3.txt
Im Skript ist die IP Adresse 239.12.255.254 die Broadadresse des SHM2. Dies ist nicht die IP Adresse des SHM2. Daher bitte nur ändern falls der SHM2 eine andere Broadadresse verwendet.
Im Skript ist der Wert 9522 der Port an den der SHM2 die Broadcast Telegramme schickt. Daher bitte nur ändern falls der SHM2 einen anderen Port verwendet.
Falls mehrere SHM2 oder Energy Meter im Netzwerk sind, dann könnte man versuchen jedem SHM2 oder Energy Meter einen eigenen Port zuzuweisen. Dann kann man mehrere SHM2 oder Energy Meter im Netzwerk abfragen.
Falls es nicht funktioniert:
1) Mit Wireshark und einem PC die Broadcast Telegramme überprüfen. (Werden die gesendet?)
2) Ports eingeschalten in der CCU3?
3) Der system.Exec Skript Befehl ist recht empfindlich. Programme so planen dass die Befehle nicht gleichzeitig ausgeführt werden.
4) Port ist bereits belegt. Vermutlich durch abgestürztes Skript und der Prozess läuft noch). --> CCU3 Neu starten oder mit shell den Prozess entfernen.
Gruss, Martin Schneider
und dem zweiten
näher erläutern,evtl. einen Screenshot vom angelegten Programm einstellen?