Open paulinchen14 opened 2 years ago
Wenn die API das liefert klar, dann sollte ich das auch rauskriegen. Leider wird mir aus dem Code-Snippet von Dir nicht klar wir :D
Bisher nutze ich u.a. folgendes php-script zum auslesen der Max-Werte. Damit erhalte ich neben dem Wert auch den entsprechenden Zeitpunkt:
Beispiel: InnenTemp: maximaler Wert InnenTemp_h: Stunde des maximalen Wertes InnenTemp_m: Minute des maximalen Wertes
Vielleicht kannst Du damit was anfangen? Wäre toll, wenn Du das integrieren könntest.
`<?php
################################################################################ #
#
#
# ################################################################################
$ip = "192.168.1.222"; $port = 45000; //Tagesmaximum... $str=chr(0xFF).chr(0xFF).chr(0x0B).chr(0x00).chr(0x06).chr(0x07).chr(0x07).chr(0x1F); $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "\n"; } if (socket_connect($sock, $ip, $port) === false) { echo "socket_connect() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "\n"; } $len = socket_write($sock, $str, strlen($str)); if (false === $len) { echo "socket_write() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "\n"; } if (false === ($buf = socket_read ($sock, 2048, PHP_BINARY_READ))) { echo "socket_read() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "\n"; return; } socket_close($sock); $format = 'x7/' . # Override first 7 bytes 'n1Innentemp/' . # Get the next 2 bytes 'C1Innentemp_h/' . # Get the next 1 byte 'C1Innentemp_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Aussentemp/' . # Get the next 2 bytes 'C1Aussentemp_h/' . # Get the next 1 byte 'C1Aussentemp_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Taupunkt/' . # Get the next 2 bytes 'C1Taupunkt_h/' . # Get the next 1 byte 'C1Taupunkt_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Hitze/' . # Get the next 2 bytes 'C1Hitze_h/' . # Get the next 1 byte 'C1Hitze_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'C1Innenfeuchte/' . # Get the next 1 byte 'C1Innenfeuchte_h/' . # Get the next 1 byte 'C1Innenfeuchte_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'C1Aussenfeuchte/' . # Get the next 1 byte 'C1Aussenfeuchte_h/' . # Get the next 1 byte 'C1Aussenfeuchte_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1AbsDruck/' . # Get the next 2 bytes 'C1AbsDruck_h/' . # Get the next 1 byte 'C1AbsDruck_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1RelDruck/' . # Get the next 2 bytes 'C1RelDruck_h/' . # Get the next 1 byte 'C1RelDruck_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Windspeed/' . # Get the next 2 bytes 'C1Windspeed_h/' . # Get the next 1 byte 'C1Windspeed_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Windboe/' . # Get the next 2 bytes 'C1Windboe_h/' . # Get the next 1 byte 'C1Windboe_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'N1Regen/' . # Get the next 4 bytes 'C1Regen_h/' . # Get the next 1 byte 'C1Regen_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'N1Licht/' . # Get the next 4 bytes 'C1Licht_h/' . # Get the next 1 byte 'C1Licht_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1UvRaw/' . # Get the next 2 bytes 'C1UvRaw_h/' . # Get the next 1 byte 'C1UvRaw_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'C1UvIdxRaw/' . # Get the next 1 byte 'C1UvIdxRaw_h/' . # Get the next 1 byte 'C1UvIdxRaw_m/'; # Get the next 1 byte $array = unpack($format, $buf); //Daten manipulieren... if($array['Innentemp'] >= pow(2, 15)) $array['Innentemp'] -= pow(2, 16); if($array['Aussentemp'] >= pow(2, 15)) $array['Aussentemp'] -= pow(2, 16); if($array['Taupunkt'] >= pow(2, 15)) $array['Taupunkt'] -= pow(2, 16); if($array['Hitze'] >= pow(2, 15)) $array['Hitze'] -= pow(2, 16); //print_r($array); //Werte-Array mit den Ergebnissen erstellen... $myResultat = array( 'InnenTemp' => $array['Innentemp'] / 10, 'InnenTemp_h' => $array['Innentemp_h'], 'InnenTemp_m' => $array['Innentemp_m'], 'AussenTemp' => $array['Aussentemp'] / 10, 'AussenTemp_h' => $array['Aussentemp_h'], 'AussenTemp_m' => $array['Aussentemp_m'], 'Taupunkt' => $array['Taupunkt'] / 10, 'Taupunkt_h' => $array['Taupunkt_h'], 'Taupunkt_m' => $array['Taupunkt_m'], 'Hitze' => $array['Hitze'] / 10, 'Hitze_h' => $array['Hitze_h'], 'Hitze_m' => $array['Hitze_m'], 'Innenfeuchte' => $array['Innenfeuchte'], 'Innenfeuchte_h' => $array['Innenfeuchte_h'], 'Innenfeuchte_m' => $array['Innenfeuchte_m'], 'Aussenfeuchte' => $array['Aussenfeuchte'], 'Aussenfeuchte_h' => $array['Aussenfeuchte_h'], 'Aussenfeuchte_m' => $array['Aussenfeuchte_m'], 'AbsDruck' => $array['AbsDruck'] / 10, 'AbsDruck_h' => $array['AbsDruck_h'], 'AbsDruck_m' => $array['AbsDruck_m'], 'RelDruck' => $array['RelDruck'] / 10, 'RelDruck_h' => $array['RelDruck_h'], 'RelDruck_m' => $array['RelDruck_m'], 'Windspeed' => $array['Windspeed'] / 10 3.6, 'Windspeed_h' => $array['Windspeed_h'], 'Windspeed_m' => $array['Windspeed_m'], 'Windboe' => $array['Windboe'] / 10 3.6, 'Windboe_h' => $array['Windboe_h'], 'Windboe_m' => $array['Windboe_m'], 'Regen' => $array['Regen'] / 10, 'Regen_h' => $array['Regen_h'], 'Regen_m' => $array['Regen_m'], 'Licht' => $array['Licht'] / 10, 'Licht_h' => $array['Licht_h'], 'Licht_m' => $array['Licht_m'], 'UvRaw' => $array['UvRaw'], 'UvRaw_h' => $array['UvRaw_h'], 'UvRaw_m' => $array['UvRaw_m'], 'UvIdxRaw' => $array['UvIdxRaw'], 'UvIdxRaw_h' => $array['UvIdxRaw_h'], 'UvIdxRaw_m' => $array['UvIdxRaw_m'] ); //Werte-Array in JSON wandeln... $myJsonResultat = json_encode($myResultat); echo $myJsonResultat; ?>`
Ah... h und m sind stunden und minuten... ich hatte irgendwie 'high' oder 'max' gedacht und mich gewundert. Ja, das sollte gehen. Ich schaue mir das die Tage mal an.
Nun habe ich mir mal die Doku nochmals angeschaut. Die Calls die ich derzeit benutzte sind die Absoluten Max-Werte. Daher auch ohne Zeitstempel. Es gibt einen extra Aufruf und die Tagesmax- / -minwerte zu lesen. Den muss ich komplett einbauen und auch mal schauen wo ich die Daten dann am besten im ioBroker ablege. Auf jeden Fall machbar.
Würde Dir das so langen?
Ein neuer State vom Typ String wo einfach die Uhrzeit drin steht. Ich könnte wohl auch ein echtes Datumsfeld draus machen... hmm...
Würde mir so völlig genügen, Danke.
Ich habe die Version 0.8.0 frei gegeben. Muss nur noch warten bis die auftaucht :D Oder direkt aus dem Repo hier installieren. Dann ich mal gespannt ob es funktioniert.
Hallo Daniel, vielen Dank für die schnelle Implementierung. Prinzipiell funktioniert das auch prima.
Bei einigen Werten werden allerdings noch falsche Werte angezeigt. Außerdem wäre es super, wenn die Stunden immer 2 stellig wären, dann könnte ich den String dann leichter zerlegen, also statt "1:15" wäre "01:15" besser.
Hier mal 2 Screenshots:
Nur zur Info: bei den beiden Zeiten, wo fehlerhaft "15:NaN" ermittelt wird, wäre eigentlich "00:15" richtig. Hilft Dir vielleicht bei der Fehlersuche...
Danke, das hilft auf alle Fälle. Ich denke auch alle Stunden unter 10 könnten noch Probleme machen 🤦 . Ich schaue mir das an und mache ein update.
Sollte nun mit 0.8.1 funktionieren.
Ja, das sieht deutlich besser aus. Es gibt noch ein Problem: Bei einem Wert wird mir als Zeitpunkt "1:531" angezeigt. Der korrekte Zeitpunkt wäre "00:00". Wahrscheinlich wieder so ein "Spezialfall" mit der 0...
hm... sollte mit dem code aber auch gehen. sicher dass das nicht ein alter wert ohne update ist? sonst gern nochmal das debug log schicken und ich schaue rein.
Ich habe jetzt die ganzen Datenpunkte mal gelöscht und den Adapter neu gestartet. Jetzt wird mir bei den Zeitpunkten, welche genau um Mitternacht liegen, "0" angezeigt. Korrekt wäre hier also "00:00". Könntest Du das bitte noch abändern.
Schick mir doch bitte noch das debug log dazu. Wenn da 'nur' eine 0 drin steht sieht es so aus als ob er gar kein update bekommen hat auf dem Datenpunkt. Muss ich schauen ob IOB den Wert wegwirft weil 0 oder ob ich gar keinen schicke.
Mache ich gerne. Das ganze tritt aber natürlich nur selten auf. Ich schau mal die nächsten Tage...
Hallo, Ich habe alle Datenpunkte manuell gelöscht und den Adapter neu gestartet. Es geht um den Zeitpunkt "indoortemp_time". Der wäre eigentlich um "00:00", der Wert wird aber nicht in den Datenpunkt geschrieben?
hier mal die Debug-Ausgabe:
2022-01-20 20:25:19.472 - debug: sainlogic.0 (23952) Scheduler connected to weather station run 255,255,11,0,6,7,7,31
--
2022-01-20 20:25:19.495 - debug: sainlogic.0 (23952) FW Scheduler Received data string: ffff0b004d074100ca0000420028003a430014012e450028003a46370000475d023b48273a14044927e414044b004b09034c006b07214e0000001e021b5500048fee0c2b5600020c0d570e0c0d7440
2022-01-20 20:25:19.496 - debug: sainlogic.0 (23952) Data Command received: 11 subcommand 7
2022-01-20 20:25:19.499 - debug: sainlogic.0 (23952) Data object: {"indoortemp":202,"indoortemp_time":0,"outdoortemp":40,"outdoortemp_time":58,"dewpointtemp":20,"dewpointtemp_time":302,"windchilltemp":40,"windchilltemp_time":58,"indoorhumidity":55,"indoorhumidity_time":0,"outdoorhumidity":93,"outdoorhumidity_time":571,"pressureabs":10042,"pressureabs_time":5124,"pressurerel":10212,"pressurerel_time":5124,"windspeed":75,"windspeed_time":2307,"windgustspeed":107,"windgustspeed_time":1825,"dailyrain":30,"dailyrain_time":539,"solarradiation":298990,"solarradiation_time":3115,"UVraw":2,"UVraw_time":3085,"uvi":14,"uvi_time":3085}
2022-01-20 20:25:19.499 - info: sainlogic.0 (23952) Scheduler updating IOBroker states
2022-01-20 20:25:19.507 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.UVraw to 2
2022-01-20 20:25:19.508 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.UVraw_time to 12:13
2022-01-20 20:25:19.508 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.dailyrain to 3
2022-01-20 20:25:19.509 - debug: sainlogic.0 (23952) Target for dailyrain unit is set: mm, using conversion: null
2022-01-20 20:25:19.509 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.dailyrain_time to 02:27
2022-01-20 20:25:19.510 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.dewpointtemp to 2
2022-01-20 20:25:19.510 - debug: sainlogic.0 (23952) Target for dewpointtemp unit is set: °C, using conversion: null
2022-01-20 20:25:19.510 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.dewpointtemp_time to 01:46
2022-01-20 20:25:19.511 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.indoorhumidity to 55
2022-01-20 20:25:19.511 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.indoortemp to 20.2
2022-01-20 20:25:19.511 - debug: sainlogic.0 (23952) Target for indoortemp unit is set: °C, using conversion: null
2022-01-20 20:25:19.512 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.outdoorhumidity to 93
2022-01-20 20:25:19.512 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.outdoorhumidity_time to 02:59
2022-01-20 20:25:19.513 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.outdoortemp to 4
2022-01-20 20:25:19.513 - debug: sainlogic.0 (23952) Target for outdoortemp unit is set: °C, using conversion: null
2022-01-20 20:25:19.513 - debug: sainlogic.0 (23952) Setting value from data for weather.maxvalues.daily.outdoortemp_time to 00:58
Hallo zusammen, hier braucht mal wieder ein Anfänger Hilfe. Habe den aktuellen Adapter installiert. Bekomme bei Ecowitt alle Daten der Station angezeigt. Leider habe ich, wenn ich den Adapter v0.8.2 starte sofort den Error:
Wäre toll wenn jemand helfen könnte. Danke und Grüße
@Maxtor62: Mach doch bitte einen eigenen Issue dafür auf. Und am besten dazuschreiben ob Du Listener oder/und Scheduler benutzt.
Hallo, bisher lese ich die WS980WIFI direkt aus. Ich möchte aber jetzt gerne auf den Adapter umsteigen.
Frage: Wäre es möglich, die Zeitpunkte der Min- und Maxwerte mit auszulesen? Bei der WS980WIFI könnten diese ja als getrennte Stunden- und Minutenangabe direkt nach dem eigentlichen Wert aus der API mit ausgelesen werden?
$format = 'x7/' . # Override first 7 bytes 'n1Innentemp/' . # Get the next 2 bytes 'C1Innentemp_h/' . # Get the next 1 byte 'C1Innentemp_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Aussentemp/' . # Get the next 2 bytes 'C1Aussentemp_h/' . # Get the next 1 byte 'C1Aussentemp_m/' . # Get the next 1 byte 'x1/' . # Override 1 byte 'n1Taupunkt/' . # Get the next 2 bytes 'C1Taupunkt_h/' . # Get the next 1 byte 'C1Taupunkt_m/' . # Get the next 1 byte ...
Ansonsten weis ich ja gar nicht, wann am heutigen Tag die höchste Windgeschwindigkeit war usw.
Viele Grüße, paulinchen