Ermöglicht die Einbindung von Energie-Zählern der Firma B+G E-Tech ohne mehrere ModBus-Instanzen in IPS.
Zusätzlich können mehrere Zähler auf einem physikalischen RS485-Bus betrieben werden.
Folgende Module beinhaltet die B+G E-Tech Library:
DRS210C
Zähler vom Typ DRS 210-C
SDM120MODBUS
Zähler vom Typ SDM 120-ModBus
DRS458
Zähler vom Typ DRS 458
DRT428M
Zähler vom Typ DRT 428M
DRT710M
Zähler vom Typ DRT 710M
SDM72D
Zähler vom Typ SDM 72D
SDM72DMV2
Zähler vom Typ SDM 72DM-V2
SDM120C
Zähler vom Typ SDM 120C
SDM220
Zähler vom Typ SDM 220
SDM230
Zähler vom Typ SDM 230
SDM530
Zähler vom Typ SDM 530
SDM630
Zähler vom Typ SDM 630
SmartX965C
Zähler vom Typ Smart X96-5C/I/J
2. Voraussetzungen
IPS 5.1 oder höher
Unterstützte Zähler
physikalisches RS485 Interface für die Zähler
3. Software-Installation
Über den ‚Module-Store‘ in IPS das Modul ‚B+G E-Tech‘ hinzufügen. Bei kommerzieller Nutzung (z.B. als Errichter oder Integrator) wenden Sie sich bitte an den Autor.
4. Einrichten der Instanzen in IP-Symcon
Ist direkt in der Dokumentation der jeweiligen Module beschrieben:
Hinweise
Eigentlich machen die Module nichts anderes, als die in IPS vorhandenen ModBus-Instanzen.
Der Unterschied ist nur, dass nach dem auslesen eines Zählers 333ms gewartet wird.
Somit kommen sich diese ‚trägen‘ Geräte auf einem physikalischen Bus nicht mehr in die Quere.
Die enthaltenden Instanzen benötigen jeweils eine Instanz vom Typ ‚ModBus Gateway‘ als übergeordnete Instanz. Dort ist die Geräte ID einzutragen.
Sofern Geräte fehlen, einfach melden. Ich binde diese ein, sofern es eine Doku über die ModBus-Register gibt.
Da ich nicht alle Zähler habe, konnte ich nicht jeden Messwert testen und musste mich auf die Hersteller-Doku stützen.
Bei Fehlern bitte melden
ich würde gerne dein Modul an meine Zähler anwenden bzw. Anpassen. Leider habe ich noch nie mit Module gearbeitet
Meine Zähler sind von der Fa.Schneider „iEM3155“
Wie mache ich das mit den Modbus Adressen und Einheiten in der module.php?
Verbrauch abfrage ist beim dem Zähler etwas uncool
1 x Adresse:3205
Einheit: SmallInt(16bit-Signed)
1 x Adresse:3206
Einheit: Integer (32bit-Signed)
Quantity gibt die Anzahl an 16bit Werten an welche du lesen willst.
Also bei dir einmal 1 und einmal 2.
Die Umrechnung musst du dann zu Fuß machen, ich habe dafür unpack genutzt.
Eventuell kannst du auch gleich einen 64bit Wert lesen? Oder mag das dein Zähler nicht?
Zum testen kann du wie folgt vorgehen:
Lade mein Modul in IPS.
Kopiere den Ordner DRS210C und gibt ihm einen neuen Namen.
Benenne die Klasse in module.php genauso.
Und dann musst du noch die Module.json anpassen.
Ebenfalls den Klassennamen und eine eigene GUID .
Dann IPS neustarten.
Anschließend kannst du eine deiner Instanzen erzeugen und in Echtzeit den Code in einem beliebigen Editor anpassen.
Michael
20.10.2017 20:32:13 | TimerPool | iEM315 (UpdateTimer): <br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>58</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>69</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>80</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>91</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>103</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>115</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type G in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>126</b><br />
Du kannst die Adresse auch als Int angeben, ich habe nur Hex genommen, weil die Doku so war von meinem Zähler
unpack(‚G‘) ist für Float.
Die Formate sind hier erklärt, sonst hilft ausprobieren. PHP: pack - Manual
Allerdings sehe ich gerade, in der deutschen Doku fehlt ‚G‘ :rolleyes:
Laut Doku für deinen Zähler hast du einen Int64.
Das sollte IPS direkt können
Adresse: 3204
Function: 3
Typ Real64 oder Int64 (ausprobieren)
Wenn du es mit dem Modul versuchen willst, dass sollte es so funktionieren:
bei meinem Zähler ist nur der Verbrauch Int64. Die Werte für Spannung, Strom usw. ist Float32.
Danke für den Beispiel. Geht aber trotzdem nicht.
Wenn ich anstatt G ein F nehme, bekomme ich komische werte. Aber ich bekomme welche.
Also ist die Verbindung da.
Spielt es eine Rolle wie der Zähler angebunden ist?
Mich wundert dass er auf 2305 überhaupt reagiert. Weil eigentlich ist es ja 2304 und dann 64 Bit.
Und das funktioniert mit der original ModBus-Instanz nicht?
Ansonsten lass dir mal das Ergebnis der Abfrage (von SendDataToParent) mit $this->SendDebug(‚test‘, $Value,1); ausgeben.
Die ersten beiden Hex Werte sind egal.
Der Rest ist die Antwort welche den Wert darstellen soll.
Dann probiere ich es mal umzurechnen
Michael
Sorry mein Fehler, hatte dein Problem nur an den Int64 wert vom Verbrauch festgemacht.
Verstehe jetzt auch warum ‚g‘ nicht funktioniert bei dir.
Ist leider eine Erweiterung von PHP welche es nicht in IPS gibt.
Also bleibt nur ‚f‘ oder ganz anders rechnen.
Am Beispiel Voltage L1 to N ist Adresse 3028, richtig ?
Was bekommst du hier den im Debug angezeigt ?
Was wenn du die Adresse auf 3029 bzw. 3027 änderst ?
Ich hatte eine Doku, da waren die Adressen als ‚Offset‘ gemeint. So dass ich immer eine Abziehen musste.
Eigentlich sollte die Umrechnung so funktionieren:
ich hab Dein Modul mal installiert, um es zu testen. Leider ohne erfreuliches Ergebnis. Ich lese meinen SDM630Modbus bisher über Client-Socket, Modbus-Gateway und Modbus Device aus. Das funktioniert auch perfekt. (Einstellungen der Modbus-Device im Screenshot, hier L1 Total kWh ).
Nach der Installation Deines Moduls werden keinerlei Fehler angezeigt. Ich benutze das gleiche Gateway für Dein Modul. Allerdings werden hier keinerlei Werte in die Variablen geschrieben. Er aktualisiert sie zwar regelmäßig, schreibt aber als Wert immer Null.
Muss ich für das Modul ein zweites Gateway installieren?
Im Debug kommt nichts an.
Als Meldung in IPS kommt:
21.10.2017 09:40:58*| TimerPool*| iEM315 (UpdateTimer): <br />
<b>Warning</b>: Cannot auto-convert value for parameter Data in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>62</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>74</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>85</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>96</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>108</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>120</b><br />
<br />
<b>Warning</b>: unpack(): Invalid format type g in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>131</b><br />
Da kommt ‚False‘ raus
Den Haken im Debug bitte auf default / grau lassen.
Du hast da jetzt einiges durcheinander geworfen, darum kommt false raus
SendDebug nach dem unpack gibt dann kein Hex mehr aus, sondern schon einen Wert, bzw ein Array.
und unpack ohne vorher die beiden ersten Zeichen abzuschneiden ist auch schlecht.
$Volt = unpack('f',strrev($Volt)); // falsch, da du die ersten Bytes nicht abgeschnitten hast
//$Volt = substr($Volt, 2);
$this->SendDebug('Volt', $Volt, 1); //Hier zu spät
vielen Dank für Dein Modul und das schnelle Update:D.
Jetzt funktioniert auch Alles. Derzeitig habe ich nur einen SDM630 dran, aber geplant ist noch ein SDM120-Modbus, da ich einen Wohnwagen zur Dauernutzung auf einer L-Leitung laufen lasse und diesen gesondert erfassen will.
habe nach hin und her probieren alles gelöscht und ein Update von deinem Modul gemacht.
Diesmal habe ich den SDM630 Ordner Kopiert und angepasst.
Und siehe da, es funktioniert :D:D:D
Ausbrobieren
Quantity auf 4 und Adresse dann 3205 oder 3204.
Rest lassen.
Wenn es nicht funktioniert, dann musst du wohl zwei Werte lesen.
Quantity auf 2 und einmal 3204 und einmal 3206 lesen.