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: 13
Registriert: Fr 19. Mär 2021, 16:26

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: 199
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 21 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.

thomas1000
Beiträge: 13
Registriert: Fr 19. Mär 2021, 16:26

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: 199
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 21 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.

Antworten