NEWS
Übergabe von Werten von Smartmeter an cFos Wallbox
- 
					
					
					
					
 Hallo, 
 ich versuche gerade den momentanen Energieverbrauch, den ich per Smartmeter-Adapter aus meinem Stromzähler auslese, der cFos Wallbox zu übergeben.
 Laut der cFos Seite unter "HTTP Zähler und Wallboxen" funktioniert das per HTTP POST.
 Getestet haben ich das mit https://reqbin.com/ und kann damit auch Werte an die Wallbox senden.
 Ich habe bisher alles mit Blockly gemacht. HTTP POST geht aber wohl nur in Javascript. Also habe ich mir da mal was zusammengesucht. Dies funktoniert aber nicht und ich habe keinen Plan, was ich da überhaupt mache.on({id: 'smartmeter.0.1-0:16_7_0__255.value', change: 'any'}, function (obj) { var request = require('request'); request.post({ url: 'http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5', form: { "import_vah" : 10000 , "power_va": 500 } }, function(error, response, body) { if (error) log(error, 'error'); }); });Die Werte für import_vah und power_va müssen natürlich später noch mit den Variablen aus dem Smartmeter-Adapter verknüpft werden. Das wird die nächste Baustelle, aber erst mal soll die Übertragung funktionieren. 
- 
					
					
					
					
 @mr-moose probiere mal const http = require("http"); const path = `http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5`; const result = http.get(path); console.log(result);alternativ das hier: (Dafür musst du aber das Modul "xmlhttprequest" in deiner Javascript Instanz eintragen!!!) var xmlhttprequest = require("xmlhttprequest").XMLHttpRequest; let url = "http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5"; let xhr = new xmlhttprequest(); xhr.open("POST", url); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; var data = '{"import_vah" : 10000 , "power_va": 500}'; xhr.send(data);steht nun was in der Console log Ausgabe bei dir? 
- 
					
					
					
					
 @xenon Danke @mr-moose probiere mal const http = require("http"); const path = `http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5`; const result = http.get(path); console.log(result);Im Log kommt dann: javascript.0 (25313) script.js.PV_/_Strom.Zähler_an_Wallbox: {'_events':{},'_eventsCount':1,'_maxListeners':100,'output':['GET /cnf?cmd=set_ajax_meter&dev_id=M5 HTTP/1.1\r\nHost: 10.10.10.30\r\nConnection: close\r\n\r\n'],'outputEncodings':['latin1'],'outputCallbacks':[null],'outputSize':88,'writable':true,'_last':true,'chunkedEncoding':false,'shouldKeepAlive':false,'useChunkedEncodingByDefault':false,'sendDate':false,'_removedConnection':false,'_removedContLen':false,'_removedTE':false,'_contentLength':0,'_hasBody':true,'_trailer':'','finished':true,'_headerSent':true,'socket':null,'connection':null,'_header':'GET /cnf?cmd=set_ajax_meter&dev_id=M5 HTTP/1.1\r\nHost: 10.10.10.30\r\nConnection: close\r\n\r\n','agent':{'_events':{},'_eventsCount':1,'defaultPort':80,'protocol':'http:','options':{'path':null},'requests':{},'sockets':{'10.10.10.30:80:':[{'connecting':true,'_hadError':false,'_handle':{'reading':false,'onconnection':null},'_parent':null,'_host':null,'_readableState':{'objectMode':false,'highWaterMark':16384,'buffer':{'head':null,'tail':null,'length':0},'length':0,'pipes':null,'pipesCount':0,'flowing':null,'ended':false,'endEmitted':false,'reading':false,'sync':true,'needReadable':false,'emittedReadable':false,'readableListening':false,'resumeScheduled':false,'paused':true,'emitClose':false,'autoDestroy':false,'destroyed':false,'defaultEncoding':'utf8','awaitDrain':0,'readingMore':false,'decoder':null,'encoding':null},'readable':false,'_events':{},'_eventsCount':5,'_maxListeners':100,'_writableState':{'objectMode':false,'highWaterMark':16384,'finalCalled':false,'needDrain':false,'ending':false,'ended':false,'finished':false,'destroyed':false,'decodeStrings':false,'defaultEncoding':'utf8','length':0,'writing':false,'corked':0,'sync':true,'bufferProcessing':false,'writecb':null,'writelen':0,'bufferedRequest':null,'lastBufferedRequest':null,'pendingcb':0,'prefinished':false,'errorEmitted':false,'emitClose':false,'autoDestroy':false,'bufferedRequestCount':0,'corkedRequestsFree':{'next':null,'entry':null}},'writable':true,'allowHalfOpen':false,'_sockname':null,'_pendingData':null,'_pendingEncoding':'','server':null,'_server':null}]},'freeSockets':{},'keepAliveMsecs':1000,'keepAlive':false,'maxSockets':null,'maxFreeSockets':256},'method':'GET','path':'/cnf?cmd=set_ajax_meter&dev_id=M5','_ended':false,'res':null,'timeoutCb':null,'upgradeOrConnect':false,'parser':null,'maxHeadersCount':null}alternativ das hier: (Dafür musst du aber das Modul "xmlhttprequest" in deiner Javascript Instanz eintragen!!!) var xmlhttprequest = require("xmlhttprequest").XMLHttpRequest; let url = "http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5"; let xhr = new xmlhttprequest(); xhr.open("POST", url); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; var data = '{"import_vah" : 10000 , "power_va": 500}'; xhr.send(data);steht nun was in der Console log Ausgabe bei dir? xmlhttprequest habe ich oben bei "zusätzliche NPM-Module" eingetragen. 
 Im Log kommt:08:34:54.732 info javascript.0 (18929) script.js.PV_/_Strom.Zähler_an_Wallbox: 401 08:34:54.733 info javascript.0 (18929) script.js.PV_/_Strom.Zähler_an_Wallbox: Unauthorized
- 
					
					
					
					
 beim xml wird auch post gesetzt, also will er wahrscheinlich einen token, passwort oder ähnliches? Du kannst doch bei Reqbin auch Code ausgeben lassen wenn ich da richtig bin ? 
- 
					
					
					
					
 @xenon 
 Mit reqbin sende ich ohne Authorization. Wenn ich dort den Javascript/AJAX exportiere erhalte ich das:var url = "http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5"; var xhr = new XMLHttpRequest(); xhr.open("POST", url); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; var data = `{ "import_vah": 7489627.7, "power_va": 416.8 }`; xhr.send(data);Im Log erscheinen folgende Fehler: javascript.0 2021-07-09 12:14:42.013 error (22767) at processImmediate (timers.js:658:5) javascript.0 2021-07-09 12:14:42.012 error (22767) at tryOnImmediate (timers.js:676:5) javascript.0 2021-07-09 12:14:42.012 error (22767) at runCallback (timers.js:705:18) javascript.0 2021-07-09 12:14:42.012 error (22767) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4851:37) javascript.0 2021-07-09 12:14:42.012 error (22767) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:472:25) javascript.0 2021-07-09 12:14:42.012 error (22767) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1055:38) javascript.0 2021-07-09 12:14:42.012 error (22767) at Object.<anonymous> (script.js.PV_/_Strom.Zähler_an_Wallbox:4:11) javascript.0 2021-07-09 12:14:42.010 error (22767) Error in callback: ReferenceError: XMLHttpRequest is not definedxmlhttprequest scheint wohl nicht zu funktionieren, obwohl es im Javascript Adapter eingetragen ist. 
- 
					
					
					
					
 @mr-moose doch, du musst es aber vorher auch importieren, das habe ich in meinem Beispiel ja getan 
- 
					
					
					
					
 @xenon 
 Es war doch die Authorization. Reqbin konnte nur senden, weil ich in einem anderen Browser-Tab in der Wallbox eingeloggt war.
 Was mir jetzt noch fehlt sind die Variablen Arbeit und Leistung in den Zeilen 24 und 25. So wie es jetzt ist funktioniert es nicht.on({id: 'smartmeter.0.1-0:16_7_0__255.value', change: 'any'}, function (obj) { var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; Arbeit = getState("smartmeter.0.1-0:1_8_0__255.value").val; Arbeit = Arbeit * 1000 Leistung = getState("smartmeter.0.1-0:16_7_0__255.value").val; console.log(Arbeit); console.log(Leistung); var url = "http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5"; var xhr = new XMLHttpRequest(); xhr.open("POST", url); xhr.setRequestHeader("Authorization", "Basic ***password***"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; var data = `{ "import_vah": Arbeit, "power_va": Leistung }`; xhr.send(data); });
- 
					
					
					
					
 @mr-moose aber der authorization Fehler ist weg? Und über reqbin kannst du die Daten senden? Bitte gib mal den exakten Code an, womit es bei reqbin funktioniert (falls da Zugangsdaten stehen ersetze sie einfach durch xxxx) 
- 
					
					
					
					
 @xenon 
 Ja, funktioniert. Auch aus iobroker mit dem Code oben wenn ich da in Zeile 24 und 25 anstatt der Variablen Zahlen einsetze.
 Ich brauche da aber die Variablen Arbeit und Leistung. Wie schreibt man das in JavaScript?
- 
					
					
					
					
 
- 
					
					
					
					
 @xenon 
 Super, jetzt geht es. Vielen Dank für deine Hilfe!
 Hier nochmal die lauffähige Version, falls sie mal einer braucht.on({id: 'smartmeter.0.1-0:16_7_0__255.value', change: 'any'}, function (obj) { var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; Arbeit = getState("smartmeter.0.1-0:1_8_0__255.value").val; Arbeit = Arbeit * 1000 Leistung = getState("smartmeter.0.1-0:16_7_0__255.value").val; var url = "http://10.10.10.30/cnf?cmd=set_ajax_meter&dev_id=M5"; var xhr = new XMLHttpRequest(); xhr.open("POST", url); xhr.setRequestHeader("Authorization", "Basic YWRtaW46MTIzNGFiY2Q="); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; var data = `{ "import_vah": ${Arbeit}, "power_va": ${Leistung} }`; xhr.send(data); });
- 
					
					
					
					
 @mr-moose gerne  
- 
					
					
					
					
 wäre es nicht gut wenn wir nen adapter dafür hätten? 
- 
					
					
					
					
 Moin 
 ich hab oben gezeigtes Skript versucht einzubinden, um mir einen weiteren Zähler für Überschussladen zu ersparen
 Allerdings bekomme ich keine Werte in der cfos angezeigt
 Nutzt noch jemand das Skript, @Mr-Moose war schon länger nicht mehr online - evtl. schaut er ja aber nochmal reinich hab das Skript wie gepostet übernommen 
 die ID für den Tasmota ESP (sonoff.0.DVES_XXXXXXX._Power_curr und _total_in übernommen )
 aktuelles Passwort in Klartext übernommen sowie meine IP der cfos eingetragenin der cfos : 
 Zählertest mit HTTP Input
 IP des IoBroker eingetragenOutput sieht dann leider so aus, sprich es kommen keine Werte: Version: 1.12.0 ESP Time: 2022-06-05 07:08:27 Device 'meter_ajax': HTTP input Address: meine_ioBroker_IP, Id: 1 
 Config: {}Voltage: 230, 230, 230 
 Current: 0.000000, 0.000000, 0.000000
 Power: 0 VA
 Import/Export: 0 Wh, 0 WhKann mir jemand Hilfestellung geben? 
 Denke die Zeile 5 im Skript (Arbeit = Arbeit * 1000) kann ich bei mir löschen, der Momentanverbrauch wird direkt in W ausgegeben (??)mfg und schönen Sonntag 
 Stefan
- 
					
					
					
					
 es geht nun auch bei mir 
 ein deutlicherer Hinweis seitens cfos in deren Hilfe bezüglich ZählerID hätte (mir) geholfen
 es ist diese hier wenn man den Zähler öffnet (M4 bei mir)und statt Zählertest legt man einfach den HTTPInput Zähler in der cfos an, Feld für Adresse kann leer bleiben, der Zähler nimmt von allen Sendern Werte an (AUth halt)  Danke @Mr-Moose für das Teilen des Skripts hier! mfg 
 STefan
- 
					
					
					
					
 und noch ein Hinweis 
 ich konnte zwar die Leistung an den HTTP Input Zähler übergeben
 aber das Solarladen funktionierte noch nicht, Ladevorgang startete nicht bzw wenn dann nur mit der voreingestellten Leistung, nicht dynamisch
 Die cfos benötigt zusätzlich den Strom (A) um den Ladestrom abhängig vom Solarstrom zu regeln (zw 6 und 16A halt)
 (Einen Dank an den schnellen cfos Support und einem Nutzer aus dem goingelectric Forum)
 dazu hab ich die Variable wie in der cfos Doku noch übergeben
 "current": [c1, c2, c3],Skript ergänzt um folgende Zeile (Strom=Leistung x 1000 / 3 x 230) Strom = Leistung / 0.690 var data = { "import_vah": ${Arbeit}, "power_va": ${Leistung}, "current": [${Strom}, ${Strom}, ${Strom}] };
 xhr.send(data);was ich jetzt noch suche, ist wie ich die Daten der Ladekurve ebenfalls in IoB bekomme, um Sie in Grafana auszuwerten 
 Falls mir da jemand auf die Sprünge helfen magaktuell bekommt die eKiste also wenn möglich nur noch grünen Strom  Die Zählerdaten in ioBroker kommen über einen Tasmota ESP rein, der mit einem "Hichi" Infrarot Lesekopf ausgestattet ist und per MQTT mit ioB kommuniziert mfg STefan 
- 
					
					
					
					
 @euro 
 Ich habe auch eine cfos-Wallbox (und eine go-e) und lese den Strom mit dem Hichi über Tasmota aus (alle 10s). cfos habe ich per Modbus Adapter im Iobroker.Ich habe 3 Ladeprofile: 
 a) Volle 16A
 b) min+PV (6A + ggf. PV-Überschuss, wenn mehr da ist)
 c) NurPVDa ich mit der PV-Übeschussladung im Powerbrain nicht klargekommen bin habe ich mir in Iobroker ein Skript gebastelt. - Alle 10s ermittle ich den derzeitigen PV-Überschuss:
 Wert vom Hichi bereinigt um Ladeleistung der Wallbox
- Division des PV-Überschuss / 230.
 Dadurch habe den PV-Überschuss in Ampere (gerundet).
- Schreibe ich diesen Wert in das passende Register (alle 10s)
- Skript schickt je nach Ladeprofil den passenden Wert (in A) ans cfos.
- Damit es an der Schwelle zu 6A nicht permanent ein- und wieder ausschaltet
 habe ich eine Trägheit für den Wert < 6A verwendet (gleitender Durchschnitt des PV-Überschusses der letzten 8 Werte). Erst wenn dieser unter 5A geht, sende ich das Stop-Signal.
 Habe dies so seit einigen Monaten so am laufen. 
 rot: cfos
 blau: go-e
 gelb: PV-ÜberschussHier ein Tag: 
  
 Hier ein Teil des selben Tages:
  Dies war der heutige Tag: (war jedoch go-e) 
  Das Gleiche in größerer Auflösung: 
  Man kann erkennen, dass um 17:15 Uhr nicht mehr genügend Überschuss vorhanden war. Daher wurde die Ladung unterbrochen. Hinweis: 
 Ich lade nur 1-Phasig, da meine PV nur bei optimalen Bedingung 4700W
 schafft. Da hätte ich ein ständiges Umschalten von 1 auf 3 Phasen.
 Ausserdem können beide Fahrzeuge nur 1-Phasig laden.Gruß Claus 
- Alle 10s ermittle ich den derzeitigen PV-Überschuss:
- 
					
					
					
					
 Hallo Claus, 
 was war denn das Problem bei der cfos Laderegel?
 oder lag das mehr in der Anbindung des go-e ?ich habe zwar knapp 10kWp, davon allerdings 7 auf Nord 
 weshalb auch selten mal 7 runterkommen. Wenn dann Verbraucher dazukommen, stoppt der 3-phasige Ladevorgang recht schnell, bin daher auch fast nur 1-phasig am laden.
 Das klappt aber seit der Umsetzung super, konnten eigentlich bei dem tollen Sommer rein mit solar den Akku füllenwerde die Lösung nun nochmal bei einem Vater nachbauen, da hab ich grad 8kWp gebaut. 
 ioBroker mit hichi und ne cfos ist dort ebenfalls vorhanden mfg 
 STefan
- 
					
					
					
					
 Ich hatte die Steuerung für Go-e sowieso. Daher wollte ich es gleich haben. 
 Mein ursprüngliches Problem war die Einbindung des Hauszählers mit dem Hitchi+Tasmota.
- 
					
					
					
					
 @euro said in Übergabe von Werten von Smartmeter an cFos Wallbox: und noch ein Hinweis 
 ich konnte zwar die Leistung an den HTTP Input Zähler übergeben
 aber das Solarladen funktionierte noch nicht, Ladevorgang startete nicht bzw wenn dann nur mit der voreingestellten Leistung, nicht dynamisch
 Die cfos benötigt zusätzlich den Strom (A) um den Ladestrom abhängig vom Solarstrom zu regeln (zw 6 und 16A halt)
 (Einen Dank an den schnellen cfos Support und einem Nutzer aus dem goingelectric Forum)
 dazu hab ich die Variable wie in der cfos Doku noch übergeben
 "current": [c1, c2, c3],Skript ergänzt um folgende Zeile (Strom=Leistung x 1000 / 3 x 230) Strom = Leistung / 0.690 var data = { "import_vah": ${Arbeit}, "power_va": ${Leistung}, "current": [${Strom}, ${Strom}, ${Strom}] };
 xhr.send(data);was ich jetzt noch suche, ist wie ich die Daten der Ladekurve ebenfalls in IoB bekomme, um Sie in Grafana auszuwerten 
 Falls mir da jemand auf die Sprünge helfen magaktuell bekommt die eKiste also wenn möglich nur noch grünen Strom  Die Zählerdaten in ioBroker kommen über einen Tasmota ESP rein, der mit einem "Hichi" Infrarot Lesekopf ausgestattet ist und per MQTT mit ioB kommuniziert mfg STefan Hallo zusammen, hätte jemand der Vollständigkeit halber eventuell nochmal das komplette funktionierende Script, inklusive der Anpassung von @euro - und kurzer Erläuterung, welche Variable was ist? Ist "Arbeit" der aufsummierte Import? Wozu braucht man den? Ich wäre jetzt davon ausgegangen, dass man nur die aktuelle Leistung am Hausanschluss übergeben muss (inkl. errechneter Stromstärken anscheinend)? Kann das kurz jemand klarstellen? Danke! Gruß 
 Hendrik
 
		
	 
		
	