ELV Wetterstation WS980WiFi

Begonnen von doesel, 02 Januar 2019, 16:30:07

Vorheriges Thema - Nächstes Thema

pejonp

@doesel
Du kannst ja mal versuchen den jeelink im debugmodus zu betreiben um zu sehen ob irgend etwas empfangen wird

Set jeelink raw 1d

Vielleicht mal von fhem trennen und nur per Terminal mitlesen.

Pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

choenig

Hi,

man kann die Station per WiFi auslesen.

Mit unterstützung aus dem ELV-Forum (https://www.elv.de/topic/protokolldefinition-zum-datenaustausch-ws980-zum-pc.html) habe ich ein kleines perl script geschrieben, welches die Daten ausgibt. Wenn ich Zeit habe, würde ich ein triviales Plugin daraus bauen.


use IO::Socket::INET;
use POSIX qw(strftime);

sub getDataFromWS($)
{
    my ($ip) = @_;
    my $socket = IO::Socket::INET->new(PeerAddr => $ip,
                                       PeerPort => '45000',
                                       Proto    => 'tcp',
                                       Type     => SOCK_STREAM);

    return "cannot connect to the server $!" unless $socket;

    my $req = "\xff\xff\x0b\x00\x06\x04\x04\x19";
    my $size = $socket->send($req);

    # notify server that request has been sent
    #shutdown($socket, 1);

    # receive a response of up to 1024 characters from server
    my $response = "";
    $socket->recv($response, 1024);

    my @array = split('', $response);
    my $buf = "";
    foreach (@array){
        $buf .= sprintf "%02x", ord($_) ;
    }

    my $ret = "";
    #$ret .= sprintf("%s\n", $buf);

    my $datestring = strftime "%F %T", localtime;
    $ret .= sprintf("     timestamp: $datestring\n");

    my $HeaderLength = 6;
    my %Values = (
        1  => {"name" => "temperatureInside",  "width" => 2, "factor" => 10},
        2  => {"name" => "temperature",        "width" => 2, "factor" => 10},
        3  => {"name" => "dewPoint",           "width" => 2, "factor" => 10},
        4  => {"name" => "windChill",          "width" => 2, "factor" => 10},
        5  => {"name" => "heatIndex",          "width" => 2, "factor" => 10},
        6  => {"name" => "humidityInside",     "width" => 1, "factor" =>  1},
        7  => {"name" => "humidity",           "width" => 1, "factor" =>  1},
        8  => {"name" => "Druck1",             "width" => 2, "factor" => 10},
        9  => {"name" => "Druck2",             "width" => 2, "factor" => 10},
        10 => {"name" => "windDirection",      "width" => 2, "factor" =>  1},
        11 => {"name" => "windSpeed",          "width" => 2, "factor" => 10},
        12 => {"name" => "windGusts",          "width" => 2, "factor" => 10},
        14 => {"name" => "rainPerHour",        "width" => 4, "factor" => 10},
        16 => {"name" => "rainPerDay",         "width" => 4, "factor" => 10},
        17 => {"name" => "rainPerWeek",        "width" => 4, "factor" => 10},
        18 => {"name" => "rainPerMonth",       "width" => 4, "factor" => 10},
        19 => {"name" => "rainPerYear",        "width" => 4, "factor" => 10},
        20 => {"name" => "rainTotal",          "width" => 4, "factor" => 10},
        21 => {"name" => "brightness",         "width" => 4, "factor" => 10},
        #22 => {"name" => "SolarRadiation???", "width" => 2, "factor" => 1},
        #23 => {"name" => "???",               "width" => 2, "factor" => 1},
    );

    for (my $i = $HeaderLength*2; $i < length($buf); $i += 2)
    {
        my $id = hex(substr($buf,$i,2));
        if (!(exists $Values{$id})) {
            $ret .= sprintf("%d not found, exiting\n", $id);
            for (my $j = $i; $j < length($buf); $j += 2) {
                my $id = hex(substr($buf,$j,2));
                $ret .= sprintf("%d ", $id);
            }
            last;
        }

        my $width = $Values{$id}{"width"};

        my $value = hex(substr($buf, $i + 2, $width*2)) / $Values{$id}{"factor"};
        $ret .= sprintf("%2d - %s: %.2f\n", $id, $Values{$id}{"name"}, $value);

        # go to next
        $i += $width * 2;
    }
    $socket->close();
    return $ret;
}


Die Felder 22 und 23 konnten wir noch nicht zuordnen, bei Druck1 und Druck2 ist mir noch nicht klar, welcher Wert welcher ist.

So sieht die Ausgabe aus:

     timestamp: 2019-02-07 22:54:43
1 - temperatureInside: 22.30
2 - temperature: 5.70
3 - dewPoint: 1.80
4 - windChill: 5.70
5 - heatIndex: 5.70
6 - humidityInside: 39.00
7 - humidity: 76.00
8 - Druck1: 1008.60
9 - Druck2: 1008.60
10 - windDirection: 78.00
11 - windSpeed: 0.00
12 - windGusts: 0.00
14 - rainPerHour: 0.00
16 - rainPerDay: 1.70
17 - rainPerWeek: 2.20
18 - rainPerMonth: 8.10
19 - rainPerYear: 10.60
20 - rainTotal: 10.60
21 - brightness: 0.00
22 not found, exiting
22 0 2 23 0 193 221


LG
Christian

curt

Zitat von: choenig am 07 Februar 2019, 22:58:26
man kann die Station per WiFi auslesen.

Jetzt wird es interessant (ich suche noch (m)eine neue Wetterstation).

Fragen:
* Der Station kann ich statische IP geben, Router und DNS vorgeben?
* Will die Station "nach Hause" telefonieren?
RPI 4 - Jeelink HomeMatic Z-Wave

choenig

Hi,

Zitat von: curt am 08 Februar 2019, 17:17:18
Fragen:
* Der Station kann ich statische IP geben, Router und DNS vorgeben?

Soweit ich es sehe, kannst du sie nur per DHCP konfigurieren.

Zitat von: curt am 08 Februar 2019, 17:17:18
* Will die Station "nach Hause" telefonieren?

Bisher habe ich davon noch nichts aufgezeichnet, aber sicher bin ich da nicht. Nur die http-Requests an wunderground sehe ich, das habe ich aber so konfiguriert.

LG
Christian

curt

Zitat von: choenig am 08 Februar 2019, 18:23:46
Soweit ich es sehe, kannst du sie nur per DHCP konfigurieren.

Sehr unschön.

Für mein Verständnis: Wer ist da aktiv, wer passiv? Also ruft da FHEM eine (sich möglicherweise ändernde) IP ab? Oder sendet die Wetterstation an eine dort konfigurierte IP (die von FHEM) - oder wie ist die Sache gedacht?
RPI 4 - Jeelink HomeMatic Z-Wave

choenig

Hi,

die Wetterstation ruft ihre IP per DHCP ab und verwendet dann die, die der DHCP-Server vorgibt, vermutlich inkl. DNS etc.

Aus fhem rufst du es mit der IP auf, die die Station vom DHCP server bekommen hat.

In den nächsten Post packe ich die erste Version des Moduls ... :)

LG
Christian

choenig

Hi,

im Anhang findet ihr die erste quick and dirty Version eines Moduls, welches direkt mit der WS980 kommuniziert, ohne Umwege über wunderground.

Usage

define ws980wifi WS980 10.10.10.44 30


10.10.10.44 ist die IP eurer Station, die könnt ihr euch aus der Fritzbox holen.
30 ist das Interval der Abfrage.

LG
Christian

curt

OT

Zitat von: choenig am 08 Februar 2019, 19:06:31
die Wetterstation ruft ihre IP per DHCP ab und verwendet dann die, die der DHCP-Server vorgibt, vermutlich inkl. DNS etc.
Aus fhem rufst du es mit der IP auf, die die Station vom DHCP server bekommen hat.

Christian,
mein Beitrag ist OT - und ich will Dich absolut nicht bremsen, ganz im Gegenteil! Ich suche ja derzeit auch eine Wetterstation. Also den folgenden Absatz bitte nicht missverstehen:

Das wäre bei mir dann der zweite Sensor, der sich vermittels DHCP die IP abholt. Der erste ist ein Feinstaubsensor, der am Stromnetz hängt. Ich stelle mir gerade einen Stromausfall vor - ich wohne auf dem Lande, da kommt so etwas schon mal vor. Anschließend klingeln alle Sensoren (und Handys und Tabs) neu beim neu gestarteten DHCP-Server an. Und die IP-Adressen sind völlig anders verteilt ...

Wie gesagt: Lasse Dich durch solche Einwürfe bitte nicht stören. Ich finde toll, was Du machst, ich kann das nicht.
RPI 4 - Jeelink HomeMatic Z-Wave

gloob

Zitat von: curt am 08 Februar 2019, 19:23:33
OT

Christian,
mein Beitrag ist OT - und ich will Dich absolut nicht bremsen, ganz im Gegenteil! Ich suche ja derzeit auch eine Wetterstation. Also den folgenden Absatz bitte nicht missverstehen:

Das wäre bei mir dann der zweite Sensor, der sich vermittels DHCP die IP abholt. Der erste ist ein Feinstaubsensor, der am Stromnetz hängt. Ich stelle mir gerade einen Stromausfall vor - ich wohne auf dem Lande, da kommt so etwas schon mal vor. Anschließend klingeln alle Sensoren (und Handys und Tabs) neu beim neu gestarteten DHCP-Server an. Und die IP-Adressen sind völlig anders verteilt ...

Wie gesagt: Lasse Dich durch solche Einwürfe bitte nicht stören. Ich finde toll, was Du machst, ich kann das nicht.

Für genau den Fall, kann man in jedem ordentlichen Router statische IP Adressen per MAC Adresse vergeben lassen. Was hast du denn für einen Router? Da klappt das bestimmt auch. 
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

curt

Zitat von: gloob am 08 Februar 2019, 19:34:25
Für genau den Fall, kann man in jedem ordentlichen Router statische IP Adressen per MAC Adresse vergeben lassen. Was hast du denn für einen Router? Da klappt das bestimmt auch.

Oh, schön.

Mein Wlan-Router besteht aus einem RPi mit aktuellem Raspian. Hast Du bitte einen Lesetipp für mich?
RPI 4 - Jeelink HomeMatic Z-Wave

gloob

Zitat von: curt am 08 Februar 2019, 19:49:33
Oh, schön.

Mein Wlan-Router besteht aus einem RPi mit aktuellem Raspian. Hast Du bitte einen Lesetipp für mich?

Dein WLAN Router ist ein Raspberry Pi? Ich glaube du verwechselst da was: http://bfy.tw/MD1Z
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

curt

Zitat von: gloob am 08 Februar 2019, 19:55:01
Dein WLAN Router ist ein Raspberry Pi?

Ja, korrekt. An einem USB-Port ist eine ziemlich große WLAN-Antenne. - Nicht alles, was Du nicht kennst, gibt es nicht.

Zitat von: gloob am 08 Februar 2019, 19:55:01
Ich glaube du verwechselst da was: http://bfy.tw/MD1Z

Ich verwechsele nichts. Du aber: Der gute Ton ist in der anderen Schublade.
RPI 4 - Jeelink HomeMatic Z-Wave

gloob

#27
Sorry fürs OT:

Zitat von: curt am 08 Februar 2019, 20:07:05
Ja, korrekt. An einem USB-Port ist eine ziemlich große WLAN-Antenne. - Nicht alles, was Du nicht kennst, gibt es nicht.
Ich verwechsele nichts. Du aber: Der gute Ton ist die andere Schublade.

Wenn du so viel Ahnung hast, dass du deine Raspberry als WLAN Router nutzt, solltest du auch wissen, wie man statische IPs einrichtet.
Oder ist dein Raspberry nur ein Accesspoint?
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

curt

#28
Zitat von: gloob am 08 Februar 2019, 20:08:44
Wenn du so viel Ahnung hast, dass du deine Raspberry als WLAN Router nutzt, solltest du auch wissen, wie man statische IPs einrichtet.

Es reicht.

Ich weiß, dass es in diesem Forum eher üblich ist, Fragende überheblich mit Bröckchen abzukanzeln. So in der Art "schaut alle mal her, der ist so dumm, dass den die Schweine beißen!". Du machst das auch sehr schön.

Mein Wlan-Router hat einen Bereich bis *.200 für statische IP. Der Bereich darüber - den managt DHCP. Ein Class-C-Netz, korrekt.

Mir war nicht bekannt, dass man via erkannter MAC statische IP halten kann. Mir ist immer noch unklar, wie das eigentlich gehen soll. - Aber: Ich bin lernfähig. Ein kleiner Tipp hätte gereicht.

Was glaubst Du denn, warum ich frage?

MannMannMann.

----------------
P.S:
Oh, schau an. Ein nachträglich geänderter Beitrag. Issjanett.
Natürlich ist das ein AP. Und gleichzeitig ein Router, im Intranet. Welches Haar willst Du denn als nächstes spalten?

Ich sage Dir mal, was stark gewesen wäre:
Stark wäre "Tut mir leid, aber schau mal hier, so geht das."

Die Hoffnung stirbt zuletzt ... magst Du noch ein Haar?
RPI 4 - Jeelink HomeMatic Z-Wave

gloob

#29
Zitat von: curt am 08 Februar 2019, 20:15:16
Es reicht.

Ich weiß, dass es in diesem Forum eher üblich ist, Fragende überheblich mit Bröckchen abzukanzeln. So in der Art "schaut alle mal her, der ist so dumm, dass den die Schweine beißen!". Du machst das auch sehr schön.

Mein Wlan-Router hat einen Bereich bis *.200 für statische IP. Der Bereich darüber - den managt DHCP. Ein Class-C-Netz, korrekt.

Mir war nicht bekannt, dass man via erkannter MAC statische IP halten kann. Mir ist immer noch unklar, wie das eigentlich gehen soll. - Aber: Ich bin lernfähig. Ein kleiner Tipp hätte gereicht.

Was glaubst Du denn, warum ich frage?

MannMannMann.

----------------
P.S:
Oh, schau an. Ein nachträglich geänderter Beitrag. Issjanett.
Natürlich ist das ein AP. Und gleichzeitig ein Router, im Intranet. Welches Haar willst Du denn als nächstes spalten?

Ich sage Dir mal, was stark gewesen wäre:
Stark wäre "Tut mir leid, aber schau mal hier, so geht das."

Die Hoffnung stirbt zuletzt ... magst Du noch ein Haar?

Solange wie du nicht sagst was auf deinem Raspberry läuft kann man auch keine Tipps geben. Rasbian selbst ist keine Router-Software und stellt auch nicht automatisch einen DHCP Server bereit.
Was läuft denn auf deinem Raspberry was die Router Funktionalität bereit stellt? Was für einen DHCP Server nutzt du?

Zitat von: curt am 08 Februar 2019, 20:15:16
Mein Wlan-Router hat einen Bereich bis *.200 für statische IP. Der Bereich darüber - den managt DHCP. Ein Class-C-Netz, korrekt.

Wie werden diese statischen IPs vergeben? Nach welchen Regeln?
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway