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