RegisterPropertyString("BaseURL", "https://brain.belevo.ch/storedata"); $this->RegisterPropertyString("Anlagenummer", "0"); $this->RegisterPropertyBoolean("InfluxJaNein", false); // JSON-String für Zusatzvariablen $this->RegisterPropertyString("ZusatzVariablen", json_encode([]));// Bezeichnung der Liste $this->RegisterPropertyString("Variable","0"); // Datenpunkt kann im Syncom ausgewählt werden $this->RegisterPropertyString("Variablenname","0"); // Name für Influxaufzeichnung $this->RegisterPropertyString("Gerätenummer","0"); $this->RegisterPropertyString("Ortschaft","0"); $this->RegisterVariableInteger("Wolkenwarscheinlichkeit", "Wolkenwarscheinlichkeit"); $this->RegisterVariableInteger("Temperatur", "Temperatur"); // Timer registrieren $this->RegisterTimer("Timer_Influx", 0, 'IPS_RequestAction(' . $this->InstanceID . ', "GetAction", "");'); } public function ApplyChanges() { parent::ApplyChanges(); // Holen Sie sich die Einstellung, ob Influx aktiviert ist $InfluxJaNein = $this->ReadPropertyBoolean("InfluxJaNein"); if ($InfluxJaNein) { // Timer auf 5 Minuten setzen $this->SetTimerInterval("Timer_Influx", 300000); // Alle 5 Minuten -> 5*60*1000=300000 IPS_LogMessage("Belevo_Server_Kommunikation", "Influx Ja"); } else { // Timer stoppen $this->SetTimerInterval("Timer_Influx", 0); IPS_LogMessage("Belevo_Server_Kommunikation", "Influx Nein"); } } public function getWetter($bn, $pw, $loc) { // URL mit Parametern zusammenstellen $url = "https://brain.belevo.ch/v2wetter?loc=" . urlencode($loc) . "&nr=" . urlencode($bn); // HTTP-Anfrage-Header einstellen $headers = [ "id: $pw" ]; // cURL-Initialisierung $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // HTTP-Anfrage ausführen und Antwort erhalten $response = curl_exec($ch); curl_close($ch); // Antwort in ein Array dekodieren $data = json_decode($response, true); // Überprüfen, ob die benötigten Felder vorhanden sind und zurückgeben if (isset($data['forecast']['forecastday'][0]['hour'][5]['temp_c']) && isset($data['forecast']['forecastday'][0]['hour'][8]['cloud'])) { return [ 'temp' => $data['forecast']['forecastday'][0]['hour'][5]['temp_c'], 'cloud' => $data['forecast']['forecastday'][0]['hour'][8]['cloud'] ]; } // Fehlerbehandlung return null; } private function ProcessZusatzVariablen() { // Abrufen der ZusatzVariablen-Liste $zusatzVariablen = json_decode($this->ReadPropertyString("ZusatzVariablen"), true); // JSON decodieren // Array für die Ausgabe erstellen $output = array(); // Verarbeitung der Variablen if (!empty($zusatzVariablen)) { foreach ($zusatzVariablen as $variable) { // Überprüfen, ob der Variablenname gesetzt ist if (isset($variable['Variablenname'])) { $variablenname = $variable['Variablenname']; } else { IPS_LogMessage("Belevo_Server_Kommunikation", "Variablenname nicht gesetzt für die Variable: " . json_encode($variable)); continue; // Mit der nächsten Variable fortfahren } $variableID = $variable['Variable']; // Überprüfen, ob die Variable existiert if (IPS_VariableExists($variableID)) { $wert = GetValue($variableID); // Den aktuellen Wert der Zusatzvariable abrufen // Wert dem Variablenname zuweisen $output[$variablenname] = $wert; } else { IPS_LogMessage("Belevo_Server_Kommunikation", "Variable mit ID $variableID existiert nicht."); } } } // Optional: Ausgabe im JSON-Format protokollieren IPS_LogMessage("Belevo_Server_Kommunikation", json_encode($output)); // Wenn gewünscht, kannst du das JSON zurückgeben oder speichern return json_encode($output); } public function RequestAction($Ident, $Value) { switch ($Ident) { case "GetAction": $this->GetAction(); break; default: throw new Exception("Invalid action"); } } public function GetAction() { $output = $this->ProcessZusatzVariablen(); $json = $this->MakeJson($output); // Verarbeite die Zusatzvariablen $baseURL = $this->ReadPropertyString("BaseURL"); $anlagenummer = $this->ReadPropertyString("Anlagenummer"); $answer = $this->getWetter($anlagenummer, $this->ReadPropertyString("Gerätenummer"), $this->ReadPropertyString("Ortschaft")); $this->SetValue("Temperatur", $answer['temp']); $this->SetValue("Wolkenwarscheinlichkeit", $answer['cloud']); if (!empty($json)) { // Kombiniere die URL mit der Anlagenummer $fullURL = $baseURL; $this->SendJsonToInfluxDB($fullURL, $json); } else { IPS_LogMessage("Belevo_Server_Kommunikation", "Keine Aufzeichnung im Influx: Anlagenummer oder JSON-Daten fehlen->GetAction()"); } } // Werte in ein Array packen public function MakeJson($json) { $an_nummer = $this->ReadPropertyString("Anlagenummer"); // Anlagenummer lesen $InfluxJaNein = $this->ReadPropertyBoolean("InfluxJaNein"); // Werte in ein Array packen $influxData = array( "Value" => array( "InfluxAllowed" => $InfluxJaNein // Setze InfluxAllowed ), "Parameter" => array( "Influxadr" => $an_nummer ), "Tracker" => $json // Initialisiere Tracker als leeres Array ); // Array in JSON konvertieren $json = json_encode($influxData); IPS_LogMessage("Belevo_Server_Kommunikation", "Erstelltes JSON: " . $json); // JSON zurückgeben oder weiterverarbeiten return $json; } private function SendJsonToInfluxDB($url, $jsonData) { $pw = $this->ReadPropertyString("Gerätenummer"); if (empty($pw)) { IPS_LogMessage("Belevo_Server_Kommunikation", "Fehler: Gerätenummer ist leer."); return; } // cURL Initialisieren $curl = curl_init(); // Optionen für cURL-Request definieren curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, // POST-Methode verwenden CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', // Header für JSON-Daten setzen 'Accept: application/json', 'id:'.$pw ], CURLOPT_POSTFIELDS => $jsonData // JSON-Daten als POST-Feld senden ]); // cURL-Request ausführen $result = curl_exec($curl); $error = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // cURL beenden curl_close($curl); if ($error) { IPS_LogMessage("Belevo_Server_Kommunikation", "Fehler beim Senden an Influx: " . $error); } else { IPS_LogMessage("Belevo_Server_Kommunikation", "HTTP-Status: " . $httpCode); IPS_LogMessage("Belevo_Server_Kommunikation", "Antwort von Influx: " . $result); } } } ?>