openHAB 3: Eiswarnung.de einbinden (PHP, Cron)

Hinweis: Wir haben in diesem Artikel möglicherweise Provisions-Links verwendet und sie durch (*) gekennzeichnet. Erfolgt über diese Links eine Bestellung, erhält maffert.net eine Provision. Es entstehen für Sie keine Nachteile beim Kauf oder Preis.

Hier zeige ich euch wie ihr die Daten aus eiswarnung.de in openHAB integrieren könnt. Hierzu wird eine PHP-Datei erstellt, die via einem CRONJOB die Daten von eiswarnung.de abruft und dann die Informationen via API einem ITEM (JSON) übermittelt.

Vorraussetzung:
NGINX als Webserver mit PHP installieren
API Key von eiswarnung.de -> https://www.eiswarnung.de/get-api/
Latitude and Longitude von eurem Standort > https://www.latlong.net/

Das Ergebniss sieht bei mir so aus:eiswarnung.de openHAB

PHP-Datei erstellen:
sudo nano /var/www/html/eiswarnung.php

Mit dem Inhalt:
<?php

$restapi_url = 'http://OPENHABSERVERIPHOSTNAME:8080/rest/items/Eiswarnung_JSON';

$curl = curl_init();
$post = array('key' => 'EUER API KEY VON EISWARNUNG.DE',
              'lat' => '51.xxxxxx',
              'lng' => '7.xxxxxx'
             );
curl_setopt($curl, CURLOPT_URL, 'https://api.eiswarnung.de/');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);

$result = curl_exec($curl);
if (curl_errno($curl)) {
    $result = curl_error($curl);
}

curl_close($curl);
echo $result;
$data = $result;

// Send to OpenHAB
callAPI('POST', $restapi_url, $data);

// Copied from https://weichie.com/blog/curl-api-calls-with-php/ , modified slightly
function callAPI($method, $url, $data)
{
   $curl = curl_init();
   switch ($method) {
      case "POST":
         curl_setopt($curl, CURLOPT_POST, 1);
         if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
         break;
      case "PUT":
         curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
         if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
         break;
      default:
         if ($data)
            $url = sprintf("%s?%s", $url, http_build_query($data));
   }
   // OPTIONS:
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_HTTPHEADER, array(
      'Content-Type: text/plain',
   ));
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   //curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
   // EXECUTE:
   $resultAPI = curl_exec($curl);
   if (!$resultAPI) {
//      die("Connection Failure");
   }
   curl_close($curl);
   return $resultAPI;
}
.items Datei erstellen / ergänzen:
// Eiswarnung - Internetservice Eiswarnung.de
String Eiswarnung_JSON "Alle Werte der Eiswarnung, codiert als JSON"
String   Eiswarnung_success "Status der Abfrage: [%s]" <text>
String   Eiswarnung_message "Status der Abfrage: [%s]" <text>
Number   Eiswarnung_Code "Status der Abfrage: [%s]" <text> //200 = Aufruf erfolgreich, 300 = Geokoordinaten fehlen, 400 = API Key fehlt, 401 = API Key ungültig, 402 = Tägliches Call-Limit erreicht
Number   Eiswarnung_callsLeft "Für heute übrige Abfragen: [%s]" <text>
Number   Eiswarnung_callsDailyLimit "Tägliches Kontingent an API Abfragen: [%d]" <text>
Number   Eiswarnung_callsResetInSeconds "Sek. bis zum Reset des Konti. [%d s]" <text>
String   Eiswarnung_requestDate "Zeitpunkt der Anfrage [%s]" <calendar>
Number   Eiswarnung_forecastId "Vorhersage ID [%d]" <snow> //0 = kein Eis, 1 = Eis, 2 = evtl. Eis
String   Eiswarnung_forecastText "Vorhersage [%s]" <snow>
String   Eiswarnung_forecastCity "Für die Stadt [%s]" <presence>
String   Eiswarnung_forecastDate "Vorhersage für den [%s]" <calendar>
.rules Datei erstellen / ergänzen:
rule "Eiswarnung"
    when 
        Item Eiswarnung_JSON received update
    then
        logInfo("wetter.rules", "Daten von eiswarnung.de umnwandeln - Start")
        var jsonString = Eiswarnung_JSON.state.toString()
        Eiswarnung_success.postUpdate(transform("JSONPATH", "$.success", jsonString))
        Eiswarnung_message.postUpdate(transform("JSONPATH", "$.message", jsonString))
        Eiswarnung_Code.postUpdate(transform("JSONPATH", "$.code", jsonString))
        Eiswarnung_callsLeft.postUpdate(transform("JSONPATH", "$.callsLeft", jsonString))
        Eiswarnung_callsDailyLimit.postUpdate(transform("JSONPATH", "$.callsDailyLimit", jsonString))
        Eiswarnung_callsResetInSeconds.postUpdate(transform("JSONPATH", "$.callsResetInSeconds", jsonString))
        Eiswarnung_forecastId.postUpdate(transform("JSONPATH", "$.result.forecastId", jsonString))
        Eiswarnung_forecastText.postUpdate(transform("JSONPATH", "$.result.forecastText", jsonString))
        Eiswarnung_forecastCity.postUpdate(transform("JSONPATH", "$.result.forecastCity", jsonString))
        Eiswarnung_requestDate.postUpdate(transform("JSONPATH", "$.result.requestDate", jsonString))
        Eiswarnung_forecastDate.postUpdate(transform("JSONPATH", "$.result.forecastDate", jsonString))
        logInfo("wetter.rules", "Daten von eiswarnung.de umnwandeln - Ende")
    end

rule "Eiswarnung - Benachrichtigung um 18 Uhr"
when
    Time cron "0 0 18 ? * * *" 
then
    if (Eiswarnung_forecastId.state == 1) {
        sendNotification("xx@meinedomain.de", "Eismelder meldet für morgen: Eis!")
    } else if (Eiswarnung_forecastId.state == 2) {
        sendNotification("xx@meinedomain.de", "Eismelder meldet für morgen: Eventuell Eis!")
    }
end
Cronjob erstellen:
sudo nano /etc/crontab

mit dem Inhalt ergänzen:
0 */2 * * * www-data /usr/bin/php -f /var/www/html/eiswarnung.php

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert