Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Feature Request: Zeitpunkte der Min- und MaxWerte #103

Open
paulinchen14 opened this issue Jan 5, 2022 · 20 comments · Fixed by #110
Open

Feature Request: Zeitpunkte der Min- und MaxWerte #103

paulinchen14 opened this issue Jan 5, 2022 · 20 comments · Fixed by #110
Assignees
Labels
enhancement New feature or request

Comments

@paulinchen14
Copy link

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

@phifogg
Copy link
Owner

phifogg commented Jan 5, 2022

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

@phifogg phifogg added the enhancement New feature or request label Jan 5, 2022
@phifogg phifogg self-assigned this Jan 5, 2022
@paulinchen14
Copy link
Author

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

################################################################################

Scriptbezeichnung: ws980_abfrage_maximum.php

Stand: 2019_07_30

Author: Heiko Wilknitz

Änderungen: Thomas Schmidt

- Fehlerkorrekturen und Anpassungen

- Ausgabe als Json eingefügt

Abruf der Tageshoechstwerte von einer WS980WiFi Station

Beschreibung des Kommunikationsprotokolls der Wetterstation von

R. Petzoldt (R.Petzoldt@web.de)

https://www.elv.de/topic/protokolldefinition-zum-datenaustausch-ws980-zum-pc.html

################################################################################

$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;
?>`

@phifogg
Copy link
Owner

phifogg commented Jan 9, 2022

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.

@phifogg
Copy link
Owner

phifogg commented Jan 10, 2022

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.

@phifogg
Copy link
Owner

phifogg commented Jan 10, 2022

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...

image

@paulinchen14
Copy link
Author

Würde mir so völlig genügen, Danke.

@phifogg
Copy link
Owner

phifogg commented Jan 12, 2022

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.

@paulinchen14
Copy link
Author

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:

Ws980_1

Ws980_2

@paulinchen14
Copy link
Author

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...

@phifogg
Copy link
Owner

phifogg commented Jan 12, 2022

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.

@phifogg phifogg mentioned this issue Jan 14, 2022
@phifogg
Copy link
Owner

phifogg commented Jan 14, 2022

Sollte nun mit 0.8.1 funktionieren.

@phifogg phifogg linked a pull request Jan 14, 2022 that will close this issue
@paulinchen14
Copy link
Author

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...

@phifogg
Copy link
Owner

phifogg commented Jan 19, 2022

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.

@paulinchen14
Copy link
Author

paulinchen14 commented Jan 19, 2022

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.

@phifogg
Copy link
Owner

phifogg commented Jan 20, 2022

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.

@paulinchen14
Copy link
Author

Mache ich gerne.
Das ganze tritt aber natürlich nur selten auf. Ich schau mal die nächsten Tage...

@paulinchen14
Copy link
Author

paulinchen14 commented Jan 20, 2022

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

@Maxtor62
Copy link

Maxtor62 commented May 4, 2022

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:

2022-05-04 07:38:31.722 - error: sainlogic.0 (148666) Connection error on 192.168.178.31:45000: Error: connect EISCONN 192.168.178.31:45000 - Local (192.168.178.38:40722)

Wäre toll wenn jemand helfen könnte.
Danke und Grüße

@phifogg
Copy link
Owner

phifogg commented May 4, 2022

@Maxtor62: Mach doch bitte einen eigenen Issue dafür auf. Und am besten dazuschreiben ob Du Listener oder/und Scheduler benutzt.

@phifogg
Copy link
Owner

phifogg commented Jan 21, 2025

@paulinchen14 Ist das immer noch ein issue?

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants