Hallo,
jetzt das ganze in einem neuen Thread.
An meinem Stromzähler der die Werte in D0 im Klartext ausgibt habe ich einen IP-COM-Server hängen. Diesen kann man per Aufruf IP:5555 direkt abfragen.
User "pejonp" (Jörg) hat mir hier sehr weitergeholfen und diesen Eintrag in die fhem.cfg entworfen.
#HTTPMOD Test 1
define DataLogger HTTPMOD http://IP:5555/ 60
attr DataLogger reading01Name Wert_01
attr DataLogger reading01Regex 1-0:1.8.0\*255+\(+([\d.]+)
attr DataLogger reading02Name Wert_02
attr DataLogger reading02Regex 1-0:32.7.0\*255+\(+([\d.]+)
attr DataLogger reading03Name Wert_03
attr DataLogger reading03Regex 1-0:52.7.0\*255+\(+([\d.]+)
attr DataLogger reading04Name Wert_04
attr DataLogger reading04Regex 1-0:72.7.0\*255+\(+([\d.]+)
attr DataLogger reading05Name Wert_05
attr DataLogger reading05Regex 1-0:31.7.0\*255+\(+([\d.]+)
attr DataLogger reading06Name Wert_06
attr DataLogger reading06Regex 1-0:51.7.0\*255+\(+([\d.]+)
attr DataLogger reading07Name Wert_07
attr DataLogger reading07Regex 1-0:71.7.0\*255+\(+([\d.]+)
attr DataLogger reading08Name Wert_08
attr DataLogger reading08Regex 1-0:21.7.0\*255+\([\+\-0]+([\d.]+)
attr DataLogger reading09Name Wert_09
attr DataLogger reading09Regex 1-0:41.7.0\*255+\([\+\-0]+([\d.]+)
attr DataLogger reading10Name Wert_10
attr DataLogger reading10Regex 1-0:61.7.0\*255+\([\+\-0]+([\d.]+)
attr DataLogger reading11Name Wert_10_Vorzeichen
attr DataLogger reading11Regex 1-0:61.7.0\*255+\(+([\-\+])
attr DataLogger reading12Name Wert_08_Vorzeichen
attr DataLogger reading12Regex 1-0:21.7.0\*255+\(+([\-\+])
attr DataLogger reading13Name Wert_09_Vorzeichen
attr DataLogger reading13Regex 1-0:41.7.0\*255+\(+([\-\+])
attr DataLogger room DataLogger
attr DataLogger stateFormat {sprintf("Wert1: %.1f W, Wert2 %.1f V", ReadingsVal($name,"Wert_01",0), ReadingsVal($name,"Wert_02",0))}
attr DataLogger verbose 5
define FileLog_DataLogger FileLog ./log/DataLogger-%Y-%m.log DataLogger.*
attr FileLog_DataLogger logtype text
attr FileLog_DataLogger room DataLogger
Das habe ich auch so übernohmen. Die Log-Datei hat aber keinen Eintrag. Ich vermute, dass das Problem an Regex liegt.
In BUF stehen auch die gelesenen Daten.
STATE wird aber nicht korrekt gefüllt.
Gruß Andy
Zitat von: mproper23 am 23 Oktober 2015, 11:38:18
#HTTPMOD Test 1
define DataLogger HTTPMOD http://IP:5555/ 60
....
attr DataLogger stateFormat {sprintf("Wert1: %.1f W, Wert2 %.1f V", ReadingsVal($name,"Wert_01",0), readingsVal($name,"Wert_02",0))}
Hallo Andy,
dieses hier muß in eine Zeile geschrieben werden.
attr DataLogger stateFormat {sprintf("Wert1: %.1f W, Wert2 %.1f V", ReadingsVal($name,"Wert_01",0), readingsVal($name,"Wert_02",0))}
Hast du alle Einträge in deine fhem.cfg kopiert, dann sollten auch Einträge erstellt werden. So war es jedenfalls mit deinen Testdaten.
Wenn du einen Webserver zu laufen hast, lege mal diese Datei dort ab und ändere den Aufruf einmal.
z.B.: define DataLogger HTTPMOD http://IP-webserver/zaehler.html 60
Dann sollten Werte in fhem angelegt werden.
Wenn du mit einem Browser auf den IP-COM-Server gehst, kommen dann sofort die Einträge oder dauert es etwas. Vielleicht muß man noch eine Verzögerung einbauen bis der IP-COM-Server antwortet. Hast du mal eine Beschreibung oder Bild von deinem IP-COM-Server.
Sendet dein Stromzähler ständig die Daten ?
Ich habe einen Siemens TD 3511, damit dieser Daten liefert, muß ich per Optischer Schnittstelle erst einmal ein Paar Daten senden.
Vielleicht kannst du ja mal deinen Log und fhem.cfg als Datei anhängen oder PM.
Jörg
Guten Morgen,
habe das mit der html Datei auf dem Webserver mal ausprobiert.
Da funktioniert es. Allerdings sieht der BUF dann auch ein bisschen anders aus:
HTTP/1.1 200 OK Date: Sun, 25 Oct 2015 06:43:51 GMT Server: Apache Last-Modified: Sun, 25 Oct 2015 06:37:16 GMT ETag: "3372cbf-20c-522e8135a5f00" Accept-Ranges: bytes Content-Length: 524 Connection: close Content-Type: text/html; charset=none /HAG5eHZ010C_Mla1WA02 1-0:0.0.0*255(XXXXXXXXX) 1-0:1.8.0*255(021594.4613) 1-0:96.5.5*255(82) 0-0:96.1.255*255(0000115223) 1-0:32.7.0*255(231.64*V) 1-0:52.7.0*255(230.20*V) 1-0:72.7.0*255(229.50*V) 1-0:31.7.0*255(000.82*A) 1-0:51.7.0*255(000.57*A) 1-0:71.7.0*255(000.79*A) 1-0:21.7.0*255(+00096*W) 1-0:41.7.0*255(+00110*W) 1-0:61.7.0*255(-00069*W) 1-0:96.50.0*0(EE) 1-0:96.50.0*1(07CF) 1-0:96.50.0*2(14) 1-0:96.50.0*3(08) 1-0:96.50.0*4(21) 1-0:96.50.0*5(03) 1-0:96.50.0*6(003D381B1E0A37A16E00190300009F80) 1-0:96.50.0*7(00) !
Das hier steht in der Log-Datei von fhem:
2015.10.25 08:12:14 4: DataLogger: GetUpdate called (update)
2015.10.25 08:12:14 5: DataLogger: internal interval timer set to call GetUpdate again in 60 seconds
2015.10.25 08:12:14 5: DataLogger: AddToQueue called, initial send queue length : 0
2015.10.25 08:12:14 5: DataLogger: AddToQueue adds type Update to URL http://192.168.1.1:5555/, data , header
2015.10.25 08:12:14 5: DataLogger: HandleSendQueue called, qlen = 1
2015.10.25 08:12:14 4: DataLogger: HandleSendQueue sends request type Update to URL http://192.168.1.1:5555/, data , header , timeout 2
2015.10.25 08:12:14 4: HttpUtils url=http://192.168.1.1:5555/
2015.10.25 08:12:16 3: DataLogger: Read callback: request type was Update, no headers, buffer empty,
Error read from http://192.168.1.1:5555 timed out
Der IP-COM Server sendet ohne Aufforderung 1:1 die Daten der seriellen Schnittstelle. In der Regel 1x pro Sekunde. Ich kann dir gerne auch mal den Port aufmachen.
Die define und attr Befhle habe ich genau so wie du sie gepostet hast übernohmen.
Gruß Andy
Zitat von: mproper23 am 25 Oktober 2015, 07:52:43
Guten Morgen,
....
2015.10.25 08:12:14 4: HttpUtils url=http://192.168.1.1:5555/
2015.10.25 08:12:16 3: DataLogger: Read callback: request type was Update, no headers, buffer empty,
Error read from http://192.168.1.1:5555 timed out
...
Hallo Andy,
mit der Adresse hat HTTPMOD vielleicht ein Problem. Versuche doch einmal http://192.168.1.1:5555// oder ein anderes Zeichen nach dem / z.B. ? . & . Malsehen was dann kommt. Ich denke das HTTPMOD einen Aufruf mit Datei benötigt oder so.
Kannst du mal deinen IP-COM-Server beschreiben oder hast du eine Webseite zum nachlesen.
Jörg
Hallo Jörg,
Auch mit / ? oder & keine Besserung.
Das ganze ist so aufgebaut, dass einfach die Daten die Seriell ankommen auf Port 5555 umgesetzt werden
Lesen tut es ja auch, die Daten stehn ja im BUFF und aktualisieren sich alle Minute. Allerdings steht immer was anderes an erster Stelle.
Soll ich dir mal den Port nach außen durchschleußen?
Gruß Andy
Zitat von: mproper23 am 25 Oktober 2015, 15:11:35
....
Soll ich dir mal den Port nach außen durchschleußen?
Hallo Andy,
Kannst du ja mal machen. Schicke mir mal die Daten per pm.
Jörg
Zitat von: mproper23 am 25 Oktober 2015, 15:11:35
...
Das ganze ist so aufgebaut, dass einfach die Daten die Seriell ankommen auf Port 5555 umgesetzt werden
Hallo Andy,
kann an deinem IP-COM-Server noch etwas eingestellt werden. Vielleicht das nach dem
...
1-0:96.50.0*5(03)
1-0:96.50.0*6(003D381B1E0A37A16E00190300009F80)
1-0:96.50.0*7(00)
!
ein EOF oder etwas anders kommt was der HTTPMOD versteht und die Daten weiterverarbeiten kann. Ist dieser Server Hardware oder Software. Gibt es dazu eine Beschreibung und kann etwas eingestellt werden. Man müßte den Datenstrom von Zeichen ! bis Zeichen ! lesen. Da bin ich aber noch nicht dahintergekommen wie man aus der Schleife rauskommt bzw. die Daten ausser in eine Datei an ein anderes Programm übergibt.
Wenn du unter Linux : wget -v http://ip-com:5555
aufrufts werden die Daten in eine Datei geschrieben und der Prozess muß erst einmal von Hand beendet werden.
Ich komme aber erst einmal nicht weiter. Wir fehlen die Ideen.
Eine habe ich noch. Man könnte 'wget -v http://ip-com:5555 &' im Hintergrund starten und ein nächster Prozess kill in dann wieder und das macht man alle 60 sek und in der Zwischenzeit kann HTTPMOD auf die erzeugte Datei zugreifen. Es besteht aber die Gefahr, wenn du den Prozess nicht kills das er dir den Speicher vollschreibt. Besser währe es man kann am IP-COM-Server etwas einstellen.
Jörg
Hallo,
Mit HTTPMOD werdet Ihr in diesem Fall leider nicht glücklich werden, da es eben für HTTP entwickelt wurde und nicht für einen beliebigen TCP Datenstrom. Bei HTTP kommt eine definierte Antwort auf eine Anfrage. Im vorliegenden Fall gibt es jedoch keine Anfragen und Antworten sondern einen fast kontinuierlichen Datenstrom. Der HTTP Request wird vermutlich einfach ignoriert. Ein Modul müsste daher die TCP Verbindung einmal öffnen und dann kontinuierlich die empfangenen Daten parsen. Schon das Abfragen in festen Intervallen ist eigentlich der falsche Weg.
Ich würde mir mal ECMD genauer ansehen.
Gruß
Stefan
Zitat von: StefanStrobel am 27 Oktober 2015, 21:30:11
......
Ich würde mir mal ECMD genauer ansehen. ..
Hallo Stefan,
Vielen dank für den tip, für eine andere Sache habe ich mir emcd auch schon angesehen bin aber noch nicht so ganz dahintergestigen wie es geht. Vielen dank.
Jörg
Hallo Andy,
habe mich mal weiter schlau gemacht. Mit ECMD und ECMDDevice geht es. Ist aber noch nicht fertig. Hab aber für heute keine Lust mehr. Am besten du machst dir eine fast leer fhem.cfg und kopierst das hier rein. Vorher FHEM-Server stopen und nach der Änderung wieder neu starten. Bitte überprüfe nach dem kopieren ob die Zugriffsrechte stimmen, speziel bei der classdef. Der Start von FHEM kann etwas dauern, da wird im Hintergrund etwas zusammengebaut.
In die fhem.cfg kommt folgendes:
define D0Z ECMD telnet ip:5555 (IP oder Servername anpassen ohne ftp oder http)
attr D0Z classdefs D0Zaehler=/opt/fhem/FHEM/D0Zaehler.classdef
attr D0Z logTraffic 2
attr D0Z partial 2
attr D0Z room D0
attr D0Z split \r\n <--- das ist wichtig sonst werden keine Daten selektiert
attr D0Z verbose 5
define myD01 ECMDDevice D0Zaehler Wert_01 Wert_02 Wert_03 L1_in
attr myD01 IODev D0Z
attr myD01 room D0
attr myD01 verbose 1
jetzt kommt die D0Zaehler.classdef diese muß ins Verz. /opt/fhem/FHEM/D0Zaehler.classdef so wie es weiter oben steht (Anlage).
Berichte einmal was so ankommt. Muß aber noch etwas verfeinert werden. Bin aber schon zufriden das es jetzt überhaupt geht.
Jörg
Hallo Andy,
ich hoffe du brauchst noch eine Lösung ;-( .
in die fhem.cfg kommt das
define D0Z ECMD telnet ip:5555
attr D0Z classdefs D0Zaehler=/opt/fhem/FHEM/D0Zaehler.classdef
attr D0Z requestSeparator
attr D0Z room D0
attr D0Z split \r\n
define myD01 ECMDDevice D0Zaehler Wert_01 Wert_02 Wert_03 Wert_04 Wert_05 Wert_06 Wert_07 Wert_08 Wert_09 Wert_10 Wert_11 Wert_12 Wert_13
attr myD01 IODev D0Z
attr myD01 room D0
attr myD01 verbose 0
define FileLog_D01 FileLog ./log/D01-%Y-%m.log myD01
attr FileLog_D01 logtype text
attr FileLog_D01 room Log
attr FileLog_D01 verbose 2
und ins Verz. /opt/fhem/FHEM/ die classdef-Datei (Anlage). Leider werden alle Sekunde die Daten mitgelogt, da habe ich noch nichts gefunden. Versuche mal ob es bei dir geht. Ich warte auf Rückmeldung.
Jörg
Hallo,
bitte entschuldigt die lange Antwortzeit. Ich hatte die letzten Wochen beruflich sehr viel um die Ohren.
2015-11-17_12:59:28 myD01 Wert_01: 021898.5791
2015-11-17_12:59:28 myD01 Wert_01 021898.5791
2015-11-17_12:59:28 myD01 Wert_02: 227.32
2015-11-17_12:59:28 myD01 Wert_02 227.32
2015-11-17_12:59:29 myD01 Wert_03: 228.30
2015-11-17_12:59:29 myD01 Wert_03 228.30
2015-11-17_12:59:29 myD01 Wert_04: 229.37
2015-11-17_12:59:29 myD01 Wert_04 229.37
2015-11-17_12:59:29 myD01 Wert_05: 000.78
2015-11-17_12:59:29 myD01 Wert_05 000.78
2015-11-17_12:59:29 myD01 Wert_06: 000.44
2015-11-17_12:59:29 myD01 Wert_06 000.44
2015-11-17_12:59:29 myD01 Wert_07: 000.91
2015-11-17_12:59:29 myD01 Wert_07 000.91
2015-11-17_12:59:29 myD01 Wert_08: 87
2015-11-17_12:59:29 myD01 Wert_08 87
2015-11-17_12:59:29 myD01 Wert_12: +
2015-11-17_12:59:29 myD01 Wert_12 +
2015-11-17_12:59:29 myD01 Wert_09: 71
2015-11-17_12:59:29 myD01 Wert_09 71
2015-11-17_12:59:29 myD01 Wert_13: +
2015-11-17_12:59:29 myD01 Wert_13 +
2015-11-17_12:59:29 myD01 Wert_11: +
2015-11-17_12:59:29 myD01 Wert_11 +
2015-11-17_12:59:29 myD01 Wert_10: 124
2015-11-17_12:59:29 myD01 Wert_10 124
Das kommt aktuell an. Sieht gut aus.
Wenn du einen Zugriff von außen brauchst kann ich dir denn gerne per PM schicken.
Gruß Andy
Daten kommen sauber rein. Habe es sogar geschafft, dass er mir die Leistung der einzelnen Phasen in ein Userreading addiert.
Eine Frage habe ich noch. Bei den Daten kommen ja Vorzeichen mit. Schafft man es irgendwie, dass fhem diese beachtet?
Vielen Dank an dieser Stelle für deinen Einsatz und deine Mühen.
Gruß Andy
Zitat von: mproper23 am 17 November 2015, 17:27:31
Daten kommen sauber rein. Habe es sogar geschafft, dass er mir die Leistung der einzelnen Phasen in ein Userreading addiert.
Eine Frage habe ich noch. Bei den Daten kommen ja Vorzeichen mit. Schafft man es irgendwie, dass fhem diese beachtet?
...
Hallo Andy,
die Vorzeichen sind ja den einzelnen Phasen zugeordnet. Du kanst ja auf (-) Minus prüfen und jetzt dann das Vorzeichen mit Wert * (-1) setzen. Die Bezeichner sind nur Beispiele, du kannst diese ja nach belieben anpassen (..ich weiß das ist dir auch klar).
Wert_11 ist Vorzeichen von Wert_10
Wert_12 ist Vorzeichen von Wert_08
Wert_13 ist Vorzeichen von Wert_09
Du könnstet diese Daten in einem Dummy oder auch vielleicht im Userreadings verarbeiten. Hier nur ein Beispiel für einen Dummy.
define Einspeisung dummy
attr Einspeisung room Sonnenbatterie
define EinspeisungNotify notify SonBat:Erzeugung.* { \
use Math::Round qw/nearest/;;\
my $a = ReadingsVal("SonBat","Erzeugung",0) ;; \
my $b = ReadingsVal("SonBat","Verbrauch",0) ;; \
my $c = ReadingsVal("SonBat","Ladeleistung",0) ;; \
my $d = ReadingsVal("SonBat","Entladeleistung",0) ;; \
my $sum1 = nearest(0.01, $a-$b-$c+$d) ;;\
my $text = "$sum1" ;; \
fhem ("set Einspeisung $text") ;; \
}
attr EinspeisungNotify room Sonnenbatterie
Oder du hängst mal dein Beispiel hier ran und schreibst was du da machen willst.
Jörg
Guten Morgen,
ich habe es hinbekommen :D
hier der Code für das UserReading:
attr myD01 stateFormat energy_current W
attr myD01 userReadings energy_current { my $phase3=ReadingsVal("myD01","Wert_10",0);; my $phase3vorzeichen=ReadingsVal("myD01","Wert_11",0);; if ($phase3vorzeichen eq "-" ) {$phase3=$phase3*(-1)};; (ReadingsVal("myD01","Wert_08",0)+ReadingsVal("myD01","Wert_11",0)+ReadingsVal("myD01","Wert_09",0)+$phase3);; }
Jetzt muss ich es nur noch hinbekommen,dass wenn die Summe negativ ist der Verbraucher mit genau dem Wert angeschaltet wird.
Unter DotNet habe ich schon einen PID Regler programmiert, dass muss jetzt noch in FHEM integriert werden.
Grüße Andy