NEWS
Adapter "smartmeter"
-
wie kann ich den Adapter in einer Multihost Umgebung installieren? `
Ich benutzte multihost (Anleitung: http://www.iobroker.net/?page_id=3068&lang=de)
Ich hatte etwas Probleme mit den unterschiedlichen IPs, aber im Grunde läuft das.
-
hm,
gerade mal deinen Adapter aus der Konsole installiert:
root@debian:~# cd /opt/iobroker/ root@debian:/opt/iobroker# npm install iobroker.smartmeter / > serialport@4.0.7 install /opt/iobroker/node_modules/iobroker.smartmeter/node_modules/smartmeter-obis/node_modules/serialport > node-pre-gyp install --fallback-to-build [serialport] Success: "/opt/iobroker/node_modules/iobroker.smartmeter/node_modules/smartmeter-obis/node_modules/serialport/build/Release/serialport.node" is installed via remote iobroker.smartmeter@0.2.0 node_modules/iobroker.smartmeter └── smartmeter-obis@0.2.5 (open-sml@0.3.1, request@2.79.0, serialport@4.0.7) root@debian:/opt/iobroker#
Sieht jetzt nicht so schlecht aus….
aber der Admin ist wieder weg.
Könnte auch an der "alten" HW liegen.
-
Hier die Sammlung meiner Scripte
Ich gehe davon aus, dass der Smartmeter den Gesamtverbrauch in dem Datenpunkt: "smartmeter.0.1-0:1_8_0*255.value" ablegt. Sollte das nicht der Fall sein, so müsst Ihr die Variable idHAGTotal in allen Skripten anpassen.
******* ALT ******* - Unten steht die neue Version.
01-Hour - Stündlich wird der Verbrauch der vergangenen Stunde im Datenpunkt Stromzähler.Hager.Verbrauch.Hour gespeichert.
!
// NEU - Zählerstand vom Anfang der akt. Stunde wird ermittelt // ! var cronStr = "0 * * * *"; ! var idHAGVorwert = "javascript.0.Stromzähler.Hager.tmp.Total-h"; var idHAGTotal = "smartmeter.0.1-0:1_8_0*255.value"; /*Stromverbrauch insgesamt*/ var idHAGZiel = "javascript.0.Stromzähler.Hager.Verbrauch.Hour"; var debug = false; ! createState(idHAGZiel, 0, { name: 'Stromverbrauch Stündlich', desc: 'Stromverbrauch Stündlich', type: 'number', unit: 'Wh', role: 'value' }); ! createState(idHAGVorwert, 0, { name: 'Stromverbrauch Gesamt Stündlich', desc: 'Stromverbrauch Gesamt Stündlich', type: 'number', unit: 'kWh', role: 'value' }); ! function haupt () { var nVorwert = getState(idHAGVorwert).val; var nAktuell = getState(idHAGTotal).val; var nDiff = ((nAktuell * 10) - (nVorwert * 10)) * 100; setState(idHAGZiel, nDiff, true); if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff); var shandler = on ({id: idHAGZiel, change: 'any'}, function(data) { setState(idHAGVorwert, (nAktuell*10)/10, true); unsubscribe(shandler); }); } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, haupt); !
02-Day - Täglich um 23:59 wird der Verbrauch des vergangenen Tages im Datenpunkt Stromzähler.Hager.Verbrauch.Day gespeichert.
!
// NEU - Zählerstand vom Anfang des Tages wird ermittelt // ! var cronStr = "59 23 * * *"; ! var idHAGVorwert = "javascript.0.Stromzähler.Hager.tmp.Total-d"; var idHAGTotal = "smartmeter.0.1-0:1_8_0*255.value"; /*Stromverbrauch insgesamt*/ var idHAGZiel = "javascript.0.Stromzähler.Hager.Verbrauch.Day"; var debug = false; ! createState(idHAGZiel, 0, { name: 'Stromverbrauch Täglich', desc: 'Stromverbrauch Täglich', type: 'number', unit: 'kWh', role: 'value' }); ! createState(idHAGVorwert, 0, { name: 'Stromverbrauch Gesamt Tag', desc: 'Stromverbrauch Gesamt Tag', type: 'number', unit: 'kWh', role: 'value' }); ! function haupt () { var nVorwert = getState(idHAGVorwert).val; var nAktuell = getState(idHAGTotal).val; var nDiff = ((nAktuell * 10) - (nVorwert * 10) ) / 10; setState(idHAGZiel, nDiff, true); if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff); var handler = on ({id: idHAGZiel, change: 'any'}, function(data) { setState(idHAGVorwert, (nAktuell*10)/10, true); unsubscribe(handler); }); } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, haupt); !
03-Week - Montags um 00:00 wird der Verbrauch der vergangenen Wocheim Datenpunkt Stromzähler.Hager.Verbrauch.Week gespeichert.
!
// NEU - Zählerstand vom Anfang der Woche wird ermittelt // ! var cronStr = "0 0 * * 1"; ! var idHAGVorwert = "javascript.0.Stromzähler.Hager.tmp.Total-w"; var idHAGTotal = "smartmeter.0.1-0:1_8_0*255.value"; /*Stromverbrauch insgesamt*/ var idHAGZiel = "javascript.0.Stromzähler.Hager.Verbrauch.Week"; var debug = false; ! createState(idHAGZiel, 0, { name: 'Stromverbrauch Wöchentlich', desc: 'Stromverbrauch Wöchentlich', type: 'number', unit: 'kWh', role: 'value' }); ! createState(idHAGVorwert, 0, { name: 'Stromverbrauch Gesamt Wöchentlich', desc: 'Stromverbrauch Gesamt Wöchentlich', type: 'number', unit: 'kWh', role: 'value' }); ! function haupt () { var nVorwert = getState(idHAGVorwert).val; var nAktuell = getState(idHAGTotal).val; var nDiff = ((nAktuell * 10) - (nVorwert * 10) ) / 10; setState(idHAGZiel, nDiff, true); if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff); var handler = on ({id: idHAGZiel, change: 'any'}, function(data) { setState(idHAGVorwert, (nAktuell*10)/10, true); unsubscribe(handler); }); } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, haupt); !
04-Month - am 1. eines Monats wird der Verbrauch des Vormonats im Datenpunkt Stromzähler.Hager.Verbrauch.Month gespeichert.
! ````
// NEU - Zählerstand vom Anfang des Monats wird ermittelt
//
! var cronStr = "0 0 1 * ";
! var idHAGVorwert = "javascript.0.Stromzähler.Hager.Total-m";
var idHAGTotal = "smartmeter.0.1-0:1_8_0255.value"; /Stromverbrauch insgesamt/
var idHAGZiel = "javascript.0.Stromzähler.Hager.Verbrauch.Month";
var debug = true;
! createState(idHAGZiel, 0, {
name: 'Stromverbrauch Monatlich',
desc: 'Stromverbrauch Monatlich',
type: 'number',
unit: 'kWh',
role: 'value'
});
! createState(idHAGVorwert, 0, {
name: 'Stromverbrauch Gesamt Monatlich',
desc: 'Stromverbrauch Gesamt Monatlich',
type: 'number',
unit: 'kWh',
role: 'value'
});
! function haupt () {
var nVorwert = getState(idHAGVorwert).val;
var nAktuell = getState(idHAGTotal).val;
var nDiff = ((nAktuell * 10) - (nVorwert * 10) ) / 10;
setState(idHAGZiel, nDiff, true);
if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff);
var handler = on ({id: idHAGZiel, change: 'any'}, function(data) {
setState(idHAGVorwert, (nAktuell*10)/10, true);
unsubscribe(handler);
});
}
! // regelmässige Wiederholungen
// -----------------------------------------------------------------------------
schedule(cronStr, haupt);******* NEU ******* >! ```` // NEU - Zählerstand vom Anfang der akt. Stunde wird ermittelt // >! var cronH = "0 * * * *"; var cronD = "59 23 * * *"; var cronW = "0 0 * * 1"; var cronM = "0 0 1 * *"; >! var idHAGTotH = "javascript.0.Stromzähler.Hager.tmp.Total-h"; var idHAGTotD = "javascript.0.Stromzähler.Hager.tmp.Total-d"; var idHAGTotW = "javascript.0.Stromzähler.Hager.tmp.Total-w"; var idHAGTotM = "javascript.0.Stromzähler.Hager.tmp.Total-m"; var idHAGTotal = "smartmeter.0.1-0:1_8_0*255.value"; /*Stromverbrauch insgesammt*/ var idHAGZielH = "javascript.0.Stromzähler.Hager.Hour"; var idHAGZielD = "javascript.0.Stromzähler.Hager.Day"; var idHAGZielW = "javascript.0.Stromzähler.Hager.Week"; var idHAGZielM = "javascript.0.Stromzähler.Hager.Month"; var debug = false; >! var DPArray = [idHAGTotH, idHAGTotD , idHAGTotW, idHAGTotM, idHAGZielH, idHAGZielD, idHAGZielW, idHAGZielM]; var DPUnit = "kWh"; >! DPArray.forEach(function(wert, index, array) { var DPType = wert.split("."); var DPDescr = "Power consumption of " + (DPType[DPType.length - 1]); if(index > 3) DPUnit = "Wh"; createState(wert, 0, { name: DPDescr, desc: DPDescr, type: 'number', unit: DPUnit, role: 'value' }); }); >! function haupt (VorId, ZielId) { var nVorwert = getState(VorId).val; var nAktuell = getState(idHAGTotal).val; var nDiff = ((nAktuell * 10) - (nVorwert * 10)) * 100; setState(ZielId, nDiff, true); if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff); var shandler = on ({id: ZielId, change: 'any'}, function(data) { setState(VorId, (nAktuell*10)/10, true); unsubscribe(shandler); }); } >! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- >! schedule(cronH, function () { haupt(idHAGTotH, idHAGZielH); }); schedule(cronD, function () { haupt(idHAGTotD, idHAGZielD); }); schedule(cronW, function () { haupt(idHAGTotW, idHAGZielW); }); schedule(cronM, function () { haupt(idHAGTotM, idHAGZielM); }); >! ```` Wie ihr sieht, sind das fast identische Skripte, die zu unterschiedlichen Zeitpunkten aufgerufen werden. Denkt daran, die Werte in der DB zu speichern. Ich empfehle die Option "nur bei Änderung" einzuschalten. Die minütlichen Werte werden eh aus dem Datenpunkt des Smartmeters: Momentanwert Gesamtwirkleistung (Total) gespeichert. <u>TODO:</u> Alles zum einen Skript zusammenfassen. ******* Siehe NEU ******* Durchschnittswerte berechnen. Kommentare und Kritik sind sehr willkommen.
-
Ich erhielt heute die folgende Meldung. ich habe gerade festgestellt das seit 13 Uhr keine Daten historisiert wurden. Hab die Ubuntu Maschine rebootet und jetzt geht es wieder der restart des Adapters hat nicht geholfen. Die Ampel des Adapters war rot
smartmeter.0 2017-02-02 20:34:37.125 info SERIALPORT ERROR: Error: Error Resource temporarily unavailable Cannot lock port smartmeter.0 2017-02-02 20:34:37.084 info starting. Version 0.2.0 in /opt/iobroker/node_modules/iobroker.smartmeter, node: v4.7.0
Woran könnte das liegen?
-
sagt syslog irgendwas?
Gibts nen anderen Prozess der ggf den Seriellen port benutzt?
Gabs 13 Uhr irgendwas im Log?
Ingo F
-
Gibts nen anderen Prozess der ggf den Seriellen port benutzt? `
Andere Baustelle, aber gibt es dann Probleme?RFLink und CUL verwenden beide den serialport.
Gruß
Rainer
-
ich versuche über die BKE-Datenschnittstelle - EHZ001 (Rückseitig) meines Hager Stromzählers ehz363W5 die Werte auszulesen. Von seriel gehe ich auf USB und bekomme folgende Daten rein:
0000000 fe ff ff ff ff ff ff ff f9 fc fb ff fe fe fe ff 0000020 ff ff fe ff fc ff ff ff fe ff ff fe ff fe ff ff 0000040 ff fc ff fe fe ff ff ff fe fe fe f0 fc ff fe 7e 0000060 ff fe ff ff f9 fa f2 ff ff ff ff ff fe ff ff fe 0000100 ff fb fe ff ff ff fe fe fe fe ff ff fe fe fe fe 0000120 fe ff fe ff fe fe fe fe ff fe fe ff fe ff fe ff 0000140 fe ff ff ff f2 fe f6 fc ff fc ff fe fe ff ff fe 0000160 fe fe 7f ff ff fe fe ff fe ff fe ff fe f7 fe fe 0000200 fe fc ff fc fe fa ff fe ff ff fe fe ff ff ff fe 0000220 f2 ff ff ff fe ed ff fe fe fe ff fe fe f6 fe ff 0000240 fe ff fc ff fe ff ff f7 ff fe ff ff ff fe ff ff 0000260 fe fe ff fe f9 ff fe fe ff fe ff fe ff ff ff fe 0000300 e0 fe fe fe ff f3 fe fe fe fb fe ff ff ff ff fe 0000320 ff fe ff fe fe ff fe f7 fe ff fa ff fe ff ff ff 0000340 ff ff fe fe ff fe ff fe e4 ff ff fe fe ff e4 ff 0000360 c0 fc ff fe ff ff dc ff fa fe f3 fe ff ff fe fe 0000400 80 fe f9 ff ff fa fe fe ff ff fe fe ff fe fe ff 0000420 fe fe f9 ff ff fc ff de ff ff fe ff fe f2 ff ff
Hat jemand eine Idee, wieso das so ist und ich nicht einfach den SML code erhalte? BTW mit dem Lesekopf von Udo kann ich vorne alles einwandfrei einlesen.
Danke
-
-
Hi,
kann es sein das ein direktes Serielles Device nicht unterstütz wird?
Ich habe zum testen einen Seriellen D0 Tastkopf welcher scheinbar nicht erkannt wird wenn ich das Device im Adapter ändere.
-
@Homoran: serialport= Library … der genannte Fehler geht um den konkreten "Device" /dev/ttyUSB0 oder so ...
@a200: Scheinbar brauchst du spezielle Serieller-Port-EInstellungen ... Hab mit Google hier was gefunden:
Danke für die Info, und…
Dieser Artikel gat mich damals abgeschreckt da weiter zu machen, sinngemäß "an den hinteren port darf nur das EVU ran"
Gruß
Rainer
-
kann es sein das ein direktes Serielles Device nicht unterstütz wird?
Ich habe zum testen einen Seriellen D0 Tastkopf welcher scheinbar nicht erkannt wird wenn ich das Device im Adapter ändere. `
An sich sollte alles gehen was seriell vom entsprechenden Linux-System unterstützt wird. Also im Zweifelsfall mal "Low level per Linux" versuchen. Da hilft bestimmt (auch wenns ein anderer Kopf ist) die "Testmöglichkeiten unter Linux" von http://wiki.volkszaehler.org/hardware/c … sb-ausgang
-
sagt syslog irgendwas?
Gibts nen anderen Prozess der ggf den Seriellen port benutzt?
Gabs 13 Uhr irgendwas im Log?
Ingo F `
Ich glaube um die Uhrzeit habe ich den Adapter aktualisiert auf die 0.2.0
Kann es der Grund sein! Morgen müsste ich mal in den Logs schauen
Gruß
Adrian
-
Nach nem Update muss man den ggf neu starten … muss nochmal schauen wo die Einstellung war das er vorm update beendet wird ...
-
kann es sein das ein direktes Serielles Device nicht unterstütz wird?
Ich habe zum testen einen Seriellen D0 Tastkopf welcher scheinbar nicht erkannt wird wenn ich das Device im Adapter ändere. `
An sich sollte alles gehen was seriell vom entsprechenden Linux-System unterstützt wird. Also im Zweifelsfall mal "Low level per Linux" versuchen. Da hilft bestimmt (auch wenns ein anderer Kopf ist) die "Testmöglichkeiten unter Linux" von http://wiki.volkszaehler.org/hardware/c … sb-ausgang `
Hi,
habe den Seriellen Tastkopf jetzt mal per USB-Seriell Adapter angeschlossen.
Welche Einstellungen sollten denn gewählt werden?
Ist das richtig für D0 =
smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 SET MESSAGE TIMEOUT TIMER: 60000 smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 CURRENT PROCESS STEP 1 IN GETNEXTMESSAGE smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 CURRENT PROCESS STEP 0 IN GETNEXTMESSAGE smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 INITIAL MESSAGES TO SEND: 2 smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 SERIALPORT RESET BAUDRATE TO 300 smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 SERIALPORT OPEN smartmeter.0 2017-02-03 09:42:58.156 debug smartmeter.0 CREATE SERIALPORT: 300 7 1 even smartmeter.0 2017-02-03 09:42:58.155 debug smartmeter.0 SmartmeterObis options: {"debug":2,"protocol":"D0Protocol","transport":"SerialRequestResponseTransport","requestInterval":"300","transportSerialPort":"/dev/ttyUSB0","transportSerialBaudra
Bin jetzt verwirrt.
Habe gerade nochmal nach der Beschreibung des Zählers gesucht um zu sehen in welchem Format die Daten da rauskommen sollen.
In der Doku steht das:
5.2 Optische Schnittstelle Die Zähler vom Typ EM 214 haben eine optische Schnittstelle, welche die Anforderungen nach DIN EN 62056-21 erfüllt. Über die optische Schnittstelle überträgt der Zähler Messwerte an ein Handgerät (HHT) oder einen PC mit dem geeigneten Kommunikationsprogramm. Der Zähler lässt sich über diese Kommunikationsverbindung auch programmieren. Die optische Schnittstelle kann in Verbindung mit jedem beliebigen optischen Messfühler verwendet werden, der die Anforderungen nach DIN EN 62056-21 erfüllt.
Wenn ich jetzt nach der DIN suche kommen Ergebnisse mit D0 oder SML :shock:
Kann mir jemand sagen was der Zähler nun spricht?
Danke
-
Woran genau schliesst Du es gerade an?
Ist es die vordere Schnittstelle von einem Stromzähler? oder was anderes?
Wenn vordere Schnittstelle dann ist es nicht wirklich das "D0 protokoll". Dann mach die einstellungen wie oben im ersten Screenshot am Threadanfang.
-
Ist gerade so angeschlossen
~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201702 ... 6d232b.jpg">https://uploads.tapatalk-cdn.com/20170203/592a71c8360d66700f8a0948836d232b.jpg</link_text>" />
~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201702 ... 144323.jpg">https://uploads.tapatalk-cdn.com/20170203/005d9c70dfe0da4f62065696d1144323.jpg</link_text>" />
Gesendet von iPhone mit Tapatalk Pro~~~~
-
Dann versuch mal die Einstellungen von oben. Wenn alles passt ist es das "Gerät sendet automatisch von sich aus die Daten" und dann sind es andere als wenn Du es per D0 anfordern musst
-
Hm,
alles probiert.
Es werden keine Smartmeter Objecte angelegt und ich denke das passiert erst wenn Daten kommen, oder?
-
Hm,
alles probiert.
Es werden keine Smartmeter Objecte angelegt und ich denke das passiert erst wenn Daten kommen, oder? `
Wie hast du den Kopf am raspi hängen? seriell oder usb?
dementsprechend schaust du erstmal ob dein Kopf was liefert.
cat /dev/ttyUSB0 | od -tx1
kommt da irgendein input raus?
alternativ du nimmst minicom.
minicom /dev/ttyUSB0 starten
mit ctrl+a z menu aufrufen
mit k(?) die konfiguration der schnittstelle geschwind. laenge, parität, stopbit einstellen
aus minicom mit (Ctrl-A, Q) raus. einstellungen beibehalten
einstellungen exportieren mit: stty -g -F /dev/ttyUSB0
du kannst dann die schnittstelle immer einstellen mit den oberen werten zb.: stty -F /dev/ttyUSB0 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 = 9600,8,N,1 oder was auch immer du brauchst.
dann wieder mit cat /dev/ttyUSB0 | od -tx1
die Ausgabe prüfen.
-
Hm,
alles probiert.
Es werden keine Smartmeter Objecte angelegt und ich denke das passiert erst wenn Daten kommen, oder? `
Wie hast du den Kopf am raspi hängen? seriell oder usb?
dementsprechend schaust du erstmal ob dein Kopf was liefert.
cat /dev/ttyUSB0 | od -tx1
kommt da irgendein input raus?
alternativ du nimmst minicom.
minicom /dev/ttyUSB0 starten
mit ctrl+a z menu aufrufen
mit k(?) die konfiguration der schnittstelle geschwind. laenge, parität, stopbit einstellen
aus minicom mit (Ctrl-A, Q) raus. einstellungen beibehalten
einstellungen exportieren mit: stty -g -F /dev/ttyUSB0
du kannst dann die schnittstelle immer einstellen mit den oberen werten zb.: stty -F /dev/ttyUSB0 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 = 9600,8,N,1 oder was auch immer du brauchst.
dann wieder mit cat /dev/ttyUSB0 | od -tx1
die Ausgabe prüfen. `
Das hatte ich schon versucht… ohne Erfolg.
Was mich stutzig macht das im Mincom Terminal immer "Offline" steht.
Wenn ich die Einstellungen in Minicom geändert habe kann ich die mit stty nicht abfragen:
root@T30:~# stty -g -F /dev/ttyUSB0 4:0:cbd:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
Oder so wenn er direkt am seriellen port steckt:
root@T30:~# stty -g -F /dev/ttyS0 4:0:dad:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
Das ganze ist zur Zeit kein PI sondern ein Lenovo T30 (Laptop) mit Debian Wheezy.
Da der Rechner einen echten Seriellen Port hat habe ich es über den und über einen USB Seriell Adapter versucht.
Zur Zeit ist der über den Adapter angeschlossen.