Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Alle zusätzlichen Module, die in die Solaranzeige integriert wurden, wie den Wetterbericht, die Solarprognose, der Messenger Pushover, Sun & Moon, aWATTar Strompreise und weitere Module.

Moderator: Ulrich

Antworten
thomas1000
Beiträge: 23
Registriert: Fr 19. Mär 2021, 16:26
Hat sich bedankt: 1 Mal

Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von thomas1000 »

Hallo zusammmen!

Die Wetterdaten vom Wetterserver sind ja gut und schön und machen sich auch recht dekorativ im Dashboard - allerdings habe ich schon seit Jahren die Homematic-Wetterstation im Garten und würde lieber die tatsächliche Temperatur, Regenmenge, Windrichtung usw. anzeigen lassen.

Wenn man eine Zentrale hat, kann man via XML die Daten ja leicht auslesen...

Bevor ich mir das jetzt zurechtfummle die Frage an die geschätzte Gemeinde: Hat das schon mal jemand gemacht?

Tausend(s) Dank im Voraus

Thomas1000

Code: Alles auswählen

<state>
<device name="Wetterstation" ise_id="6069" unreach="false" sticky_unreach="true" config_pending="false">
<channel name="Wetterstation:0" ise_id="6070">
<datapoint name="BidCos-RF.LEQ1320211:0.UNREACH" type="UNREACH" ise_id="6089" value="false" valuetype="2" valueunit="" timestamp="1613455017"/>
<datapoint name="BidCos-RF.LEQ1320211:0.STICKY_UNREACH" type="STICKY_UNREACH" ise_id="6085" value="true" valuetype="2" valueunit="" timestamp="1613454828"/>
<datapoint name="BidCos-RF.LEQ1320211:0.CONFIG_PENDING" type="CONFIG_PENDING" ise_id="6071" value="false" valuetype="2" valueunit="" timestamp="1612198971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.LOWBAT" type="LOWBAT" ise_id="6079" value="true" valuetype="2" valueunit="" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:0.RSSI_DEVICE" type="RSSI_DEVICE" ise_id="6083" value="1" valuetype="8" valueunit="" timestamp="1612198971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.RSSI_PEER" type="RSSI_PEER" ise_id="6084" value="195" valuetype="8" valueunit="" timestamp="1612198971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.DEVICE_IN_BOOTLOADER" type="DEVICE_IN_BOOTLOADER" ise_id="6075" value="false" valuetype="2" valueunit="" timestamp="1612198971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.UPDATE_PENDING" type="UPDATE_PENDING" ise_id="6093" value="false" valuetype="2" valueunit="" timestamp="1612198971"/>
</channel>
<channel name="Wetterstation sub" ise_id="6097">
<datapoint name="BidCos-RF.LEQ1320211:1.TEMPERATURE" type="TEMPERATURE" ise_id="6103" value="10.800000" valuetype="4" valueunit="°C" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.HUMIDITY" type="HUMIDITY" ise_id="6099" value="37" valuetype="16" valueunit="%" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.RAINING" type="RAINING" ise_id="6100" value="false" valuetype="2" valueunit="" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.RAIN_COUNTER" type="RAIN_COUNTER" ise_id="6101" value="1610.994999" valuetype="4" valueunit="mm" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_SPEED" type="WIND_SPEED" ise_id="6106" value="0.000000" valuetype="4" valueunit="km/h" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_DIRECTION" type="WIND_DIRECTION" ise_id="6104" value="260" valuetype="16" valueunit="degree" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_DIRECTION_RANGE" type="WIND_DIRECTION_RANGE" ise_id="6105" value="67" valuetype="16" valueunit="degree" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.SUNSHINEDURATION" type="SUNSHINEDURATION" ise_id="6102" value="139" valuetype="16" valueunit="" timestamp="1617900751"/>
<datapoint name="BidCos-RF.LEQ1320211:1.BRIGHTNESS" type="BRIGHTNESS" ise_id="6098" value="32" valuetype="16" valueunit="" timestamp="1617900751"/>
<datapoint name="Regen heute" type="" ise_id="6107" value="0.000000" valuetype="4" valueunit="mm" timestamp="1617900751"/>
<datapoint name="Regen gestern" type="" ise_id="6108" value="0.295000" valuetype="4" valueunit="mm" timestamp="1617859800"/>
</channel>
</device>
</state>

TeamO
Beiträge: 1138
Registriert: Mo 22. Jun 2020, 08:58
Wohnort: Ulm / Neu-Ulm
Hat sich bedankt: 23 Mal
Danksagung erhalten: 225 Mal

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von TeamO »

Wenn du mir genau Infos zu der XML lieferst kann ich dir eventuell was daraus machen.
Also wie die XML direkt anrufen werden kann und welche Werte genau was sind.
Gruß Timo

Auflistung Geräte/Dashboards/Anschlussart
Datenbankfelder der einzelnen Geräte
GANZ WICHTIG: Überblick der vorhandenen Anleitungen

Fertige Komplett-Systeme gibt es hier anfragen[AT]bauer-timo[.]de

Tibber Invite (100% Öko-Strom + 50€ Bonus)

thomas1000
Beiträge: 23
Registriert: Fr 19. Mär 2021, 16:26
Hat sich bedankt: 1 Mal

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von thomas1000 »

Hallo Timo,

erstmal für alle Mitleser die Grundlagen für den Abruf des XML:

1.) Die XML-API-Erweiterung muss unter System/Zusatzsoftware installiert sein - siehe: https://www.homematic-inside.de/software/xml-api bzw. https://github.com/homematic-community/XML-API/releases

2.) Mit http://<ip der homematic-zentrale>/config/xmlapi/devicelist.cgi gibt es eine Liste aller Geräte in der HM-Infrastruktur

Wenn man eine Wetterstation in Betrieb hat, dann lautet einer der Abschnitte:

Code: Alles auswählen

<device name="Wetterstation" address="LEQ1320211" ise_id="6069" interface="BidCos-RF" device_type="HM-WDS100-C6-O" ready_config="true">
<channel name="Wetterstation sub" type="22" address="LEQ1320211:1" ise_id="6097" direction="SENDER" parent_device="6069" index="1" group_partner="" aes_available="false" transmission_mode="DEFAULT" visible="true" ready_config="true" operate="true"/>
</device>
3.) Mit http://<ip der homematic-zentrale>/config/xmlapi/state.cgi?device_id=6069 (<== die ise_id hinter dem device-name)

Daraufhin liefert die Zentrale dann ein XML mit den Daten des Geräts zurück:

Code: Alles auswählen

<state>
<device name="Wetterstation" ise_id="6069" unreach="false" sticky_unreach="false" config_pending="false">
<channel name="Wetterstation:0" ise_id="6070">
<datapoint name="BidCos-RF.LEQ1320211:0.UNREACH" type="UNREACH" ise_id="6089" value="false" valuetype="2" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.STICKY_UNREACH" type="STICKY_UNREACH" ise_id="6085" value="false" valuetype="2" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.CONFIG_PENDING" type="CONFIG_PENDING" ise_id="6071" value="false" valuetype="2" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.LOWBAT" type="LOWBAT" ise_id="6079" value="true" valuetype="2" valueunit="" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:0.RSSI_DEVICE" type="RSSI_DEVICE" ise_id="6083" value="1" valuetype="8" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.RSSI_PEER" type="RSSI_PEER" ise_id="6084" value="204" valuetype="8" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.DEVICE_IN_BOOTLOADER" type="DEVICE_IN_BOOTLOADER" ise_id="6075" value="false" valuetype="2" valueunit="" timestamp="1617975971"/>
<datapoint name="BidCos-RF.LEQ1320211:0.UPDATE_PENDING" type="UPDATE_PENDING" ise_id="6093" value="false" valuetype="2" valueunit="" timestamp="1617975971"/>
</channel>
<channel name="Wetterstation sub" ise_id="6097">
<datapoint name="BidCos-RF.LEQ1320211:1.TEMPERATURE" type="TEMPERATURE" ise_id="6103" value="17.700000" valuetype="4" valueunit="°C" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.HUMIDITY" type="HUMIDITY" ise_id="6099" value="31" valuetype="16" valueunit="%" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.RAINING" type="RAINING" ise_id="6100" value="false" valuetype="2" valueunit="" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.RAIN_COUNTER" type="RAIN_COUNTER" ise_id="6101" value="1610.994999" valuetype="4" valueunit="mm" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_SPEED" type="WIND_SPEED" ise_id="6106" value="8.200000" valuetype="4" valueunit="km/h" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_DIRECTION" type="WIND_DIRECTION" ise_id="6104" value="205" valuetype="16" valueunit="degree" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.WIND_DIRECTION_RANGE" type="WIND_DIRECTION_RANGE" ise_id="6105" value="45" valuetype="16" valueunit="degree" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.SUNSHINEDURATION" type="SUNSHINEDURATION" ise_id="6102" value="17" valuetype="16" valueunit="" timestamp="1617975900"/>
<datapoint name="BidCos-RF.LEQ1320211:1.BRIGHTNESS" type="BRIGHTNESS" ise_id="6098" value="77" valuetype="16" valueunit="" timestamp="1617975900"/>
<datapoint name="Regen heute" type="" ise_id="6107" value="0.000000" valuetype="4" valueunit="mm" timestamp="1617975900"/>
<datapoint name="Regen gestern" type="" ise_id="6108" value="0.000000" valuetype="4" valueunit="mm" timestamp="1617965130"/>
</channel>
</device>
</state>
Mit ein paar Zeilen PHP kann man daraus ein etwas handlicheres Array machen:
(diese Datei ist darauf ausgelegt mit php hm_wetter.php auf der console gestartet zu werden - im Browser sieht's nicht so hübsch aus...):

Code: Alles auswählen

#!/usr/bin/php
<?php
echo "Es folgt der Wetterbericht...\n";
$hmw_ip = "192.168.0.247";
$hmw_id = 6069;

  // wir laden die XML-Datei von der Homematic-Zentrale
  $xml = simplexml_load_file("http://" . $hmw_ip . "/config/xmlapi/state.cgi?device_id=$hmw_id");

// auswerten der XML-Datei - machen wir als erstes ein Array daraus:
$json = json_encode($xml);
$wa = json_decode($json,TRUE);

// Beispiele für Ausgaben direkt aus dem Array
echo "Devicename: " . $xml->{"device"}["name"] ."\n";
echo "ise_id: " . $wa["device"]["channel"][1]["datapoint"][0]["@attributes"]["ise_id"] . "\n";
echo "Temperatur: " . $wa["device"]["channel"][1]["datapoint"][0]["@attributes"]["value"] . " " . $wa["device"]["channel"][1]["datapoint"][0]["@attributes"]["valueunit"] . "\n";

// Schreiben der Key-Value-Paare in ein handliches Array (referenziert über die ise_id):
foreach( $wa["device"]["channel"][1]["datapoint"] as $dp){
        echo "-----------------------------------------\n";
        $ise_id = $dp["@attributes"]["ise_id"];
        echo ">>>>>>Type: $ise_id \n";
        foreach( $dp["@attributes"] as $key => $value){
                $erg[$ise_id][$key] = $value;
                echo "Key: $key - Value: $value \n";
        }
  }
echo "================================================\n";
echo "Temperatur: " . number_format($erg["6103"]["value"],1);
echo $erg["6103"]["valueunit"];
echo "\n";
echo "================================================\n";
?>

Das Ergebnis des Scripts sieht dann so aus:

Code: Alles auswählen

root@solaranzeige:/var/www/html# php hm_wetter.php
Es folgt der Wetterbericht...
Devicename: Wetterstation
ise_id: 6103
Temperatur: 17.600000 °C
-----------------------------------------
>>>>>>Type: 6103
Key: name - Value: BidCos-RF.LEQ1320211:1.TEMPERATURE
Key: type - Value: TEMPERATURE
Key: ise_id - Value: 6103
Key: value - Value: 17.600000
Key: valuetype - Value: 4
Key: valueunit - Value: °C
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6099
Key: name - Value: BidCos-RF.LEQ1320211:1.HUMIDITY
Key: type - Value: HUMIDITY
Key: ise_id - Value: 6099
Key: value - Value: 29
Key: valuetype - Value: 16
Key: valueunit - Value: %
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6100
Key: name - Value: BidCos-RF.LEQ1320211:1.RAINING
Key: type - Value: RAINING
Key: ise_id - Value: 6100
Key: value - Value: false
Key: valuetype - Value: 2
Key: valueunit - Value:
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6101
Key: name - Value: BidCos-RF.LEQ1320211:1.RAIN_COUNTER
Key: type - Value: RAIN_COUNTER
Key: ise_id - Value: 6101
Key: value - Value: 1610.994999
Key: valuetype - Value: 4
Key: valueunit - Value: mm
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6106
Key: name - Value: BidCos-RF.LEQ1320211:1.WIND_SPEED
Key: type - Value: WIND_SPEED
Key: ise_id - Value: 6106
Key: value - Value: 8.800000
Key: valuetype - Value: 4
Key: valueunit - Value: km/h
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6104
Key: name - Value: BidCos-RF.LEQ1320211:1.WIND_DIRECTION
Key: type - Value: WIND_DIRECTION
Key: ise_id - Value: 6104
Key: value - Value: 210
Key: valuetype - Value: 16
Key: valueunit - Value: degree
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6105
Key: name - Value: BidCos-RF.LEQ1320211:1.WIND_DIRECTION_RANGE
Key: type - Value: WIND_DIRECTION_RANGE
Key: ise_id - Value: 6105
Key: value - Value: 45
Key: valuetype - Value: 16
Key: valueunit - Value: degree
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6102
Key: name - Value: BidCos-RF.LEQ1320211:1.SUNSHINEDURATION
Key: type - Value: SUNSHINEDURATION
Key: ise_id - Value: 6102
Key: value - Value: 38
Key: valuetype - Value: 16
Key: valueunit - Value:
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6098
Key: name - Value: BidCos-RF.LEQ1320211:1.BRIGHTNESS
Key: type - Value: BRIGHTNESS
Key: ise_id - Value: 6098
Key: value - Value: 75
Key: valuetype - Value: 16
Key: valueunit - Value:
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6107
Key: name - Value: Regen heute
Key: type - Value:
Key: ise_id - Value: 6107
Key: value - Value: 0.000000
Key: valuetype - Value: 4
Key: valueunit - Value: mm
Key: timestamp - Value: 1617977140
-----------------------------------------
>>>>>>Type: 6108
Key: name - Value: Regen gestern
Key: type - Value:
Key: ise_id - Value: 6108
Key: value - Value: 0.000000
Key: valuetype - Value: 4
Key: valueunit - Value: mm
Key: timestamp - Value: 1617965130
================================================
Temperatur: 17.6°C
================================================
Die weiteren Details können wir gerne wieder via Mail diskutieren und erst das fertige Ergebnis dann hier wieder einstellen...

1000(s) Grüße

Thomas

TeamO
Beiträge: 1138
Registriert: Mo 22. Jun 2020, 08:58
Wohnort: Ulm / Neu-Ulm
Hat sich bedankt: 23 Mal
Danksagung erhalten: 225 Mal

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von TeamO »

Sieht doch schon mal gut aus.
Uns interessiert dann aus dem Ergebnis immer nur folgendes:
Key: type - Value:
Key: value - Value:

Also um welchem Wert es sich handelt und den eigentlichen Wert.
Rest wieder per Mail.
Gruß Timo

Auflistung Geräte/Dashboards/Anschlussart
Datenbankfelder der einzelnen Geräte
GANZ WICHTIG: Überblick der vorhandenen Anleitungen

Fertige Komplett-Systeme gibt es hier anfragen[AT]bauer-timo[.]de

Tibber Invite (100% Öko-Strom + 50€ Bonus)

thomas1000
Beiträge: 23
Registriert: Fr 19. Mär 2021, 16:26
Hat sich bedankt: 1 Mal

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von thomas1000 »

Ein absolutes Mini-Script, welches die Wetterdaten aus der Homematic-Wetterstation ausliest und dann in eine Influx-Datenbank schreibt, sieht so aus.

Code: Alles auswählen

#!/usr/bin/php
<?php

$hmw_ip  = "192.168.0.247";     // hier die IP der Homematic-Zentrale eintragen
$hmw_id  = 6069;                // hier die ID der Homematic Wetterstation eintragen
$hmw_tbl = "wetter";            // Name der Tabelle innerhalb der Datenbank
$hmw_db  = "wetterstation";     // Name der Datenbank in influxdb (ggf. manuell anlegen)!
$xml = simplexml_load_file("http://" . $hmw_ip . "/config/xmlapi/state.cgi?device_id=$hmw_id"); // wir laden die XML-Datei von der Homematic-Zentrale
$json = json_encode($xml); // auswerten der XML-Datei (unwandeln in JSON und retour)
$wa = json_decode($json,TRUE);
  $query  = "$hmw_tbl ";        // Das abschließende Leerzeichen ist wichtig!
  foreach( $wa["device"]["channel"][1]["datapoint"] as $dp){ // Schreiben der Key-Value-Paare in den query-string:
        $txt_id = $dp["@attributes"]["type"];
        if ($txt_id == "") $txt_id = substr($dp["@attributes"]["name"],strrpos($dp["@attributes"]["name"],".")); // Wenn type leer ist übernehmen wir den Namen (nach dem letzten Punkt)
        $txt_id = str_replace(" ","_",$txt_id); // Leerzeichen durch Unterstrich ersetzen
        $query .= "$txt_id=" . $dp["@attributes"]["value"];
        $query .= ","; // Key-Value-Paare werden durch Komma getrennt
  }
  $query = substr($query,0,-1); // Das letzte Komma wieder enfernen
  $query .= "  ".time();        // Aktuellen Timestamp anfügen
  $query .= "\n";
  $ch = curl_init("http://localhost/write?db=$hmw_db&precision=s");
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  curl_setopt($ch, CURLOPT_TIMEOUT, 9);
  curl_setopt($ch, CURLOPT_PORT, "8086");
  curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
    $rc_info = curl_getinfo($ch);
    $Ausgabe = json_decode($result,true);
    if (curl_errno($ch)) {
      $Meldung = "Curl Fehler! Daten nicht zur InfluxDB gesendet! Curl ErrNo. ".curl_errno($ch);
    }
    elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204) {
      $Meldung = "OK. Daten zur InfluxDB  gesendet.";
    }
    else {
      $Meldung = "!!! Daten nicht zur InfluxDB gesendet! info: ".print_r($rc_info,1);
    }
  echo "Meldung: $Meldung \n";
  curl_close($ch);
  unset($ch);
?>
Dabei fehlt natürlich sämtlicher Komfort, Logging, externe Datenbank usw.

Eine ausführlichere Datei im solaranzeige-Stil sollte demnächst erscheinen...

1000(s) Grüße

Thomas

gwisy
Beiträge: 4
Registriert: Sa 28. Dez 2019, 16:46
Hat sich bedankt: 1 Mal

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von gwisy »

...wann ist "demnächst" ? Intressiere mich dafür :)
2x AX-M1/5000-48, 24x 280Watt panels, 28x 200Ah

Benutzeravatar
Ulrich
Administrator
Beiträge: 5503
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 152 Mal
Danksagung erhalten: 875 Mal
Kontaktdaten:

Re: Homematic Wetterstation einbinden - hat das schon mal jemand gemacht?

Beitrag von Ulrich »

Lese einmal das aktuelle PDF Dokument "Homematic Anbindung" durch. Da gibt es jetzt eine weitere Möglichkeit:
https://solaranzeige.de/phpBB3/download ... indung.pdf
-----------------------------------------------------
Ulrich . . . . . . . . [Projekt Administrator]

Antworten

Zurück zu „Wetterdaten, Börsenstrompreise, Solarprognose, Nachrichtendienst usw.“