Wie http Post zum lesen und Put zum schreiben nutzen?

Hallo zusammen !
Da ich kein extra Thread aufmachen möchte, der das gleiche Thema behandelt, hänge ich mich hier einmal an. Vorweg: Ich kann nicht programmieren, sondern nur gut adaptieren was man hier so überall findet. Ich hoffe, symcon kann mir das Thema ohne viel Coding erleichtern.

Möchte das Zonensystem meiner Klimaanlage/Heizung im Haus abfragen und auch steuern.
Dies geht per http POST (abfragen) und PUT (schreiben). Auf der Seite mit dem Link kann man das im Browser direkt testen und ich konnte die Werte abfragen und senden. Ist sie API Doku vom Hersteller. Nun muss ich das nur in Symcon überführen.
Dazu muss man auch beim POST diverse Informationen mitgeben.

Beispiel:

API Server: http://192.168.2.61:3000/api/v1/

REQUEST BODY
application/json
HVAC POST payload.
Abfrage Zone 1:

{
  "systemID": 1,
  "zoneID": 1
}

Als Ergebnis würde dann folgendes zurückgemeldet werden:

{
  "data": [
    {
      "systemID": 1,
      "zoneID": 1,
      "name": "Badezimmer",
      "thermos_type": 4,
      "thermos_firmware": "3.60",
      "thermos_radio": 1,
      "on": 0,
      "double_sp": 0,
      "coolsetpoint": 20.5,
      "coolmaxtemp": 23,
      "coolmintemp": 15,
      "heatsetpoint": 20.5,
      "heatmaxtemp": 23,
      "heatmintemp": 15,
      "maxTemp": 23,
      "minTemp": 15,
      "setpoint": 20.5,
      "roomTemp": 18.799999237060547,
      "sleep": 0,
      "temp_step": 0.5,
      "modes": [
        1,
        4,
        2,
        3,
        5
      ],
      "mode": 3,
      "speed": 0,
      "coldStage": 1,
      "heatStage": 1,
      "coldStages": 1,
      "heatStages": 1,
      "humidity": 57,
      "units": 0,
      "errors": [],
      "air_demand": 0,
      "floor_demand": 0,
      "cold_demand": 0,
      "heat_demand": 0,
      "heatangle": 0,
      "coldangle": 0,
      "master_zoneID": 1,
      "eco_adapt": "off",
      "antifreeze": 0,
      "open_window": 0
    }
  ]
}

Zum Senden eines Befehls würde das wie folgt aussehen:

REQUEST BODY
application/json
HVAC PUT payload.
Zone 1 Temperatur ändern und einschalten:

{
  "data": {
    "systemID": 1,
    "zoneID": 1,
    "on": 1,
    "setpoint": 24.5
  }
}

Ist das als nicht Coder überhaupt machbar ? Wie gehe ich das ganze am besten an. Ich stehe komplett hilflos da und konnte nichts vergleichbares hier im Forum finden oder keine Instanz die mir helfen könnte wie der JSON Decoder. Möchte die empfangenen Werte gerne in Variablen schreiben und ggf. auch mit dem PUT Befehl verändern.

Danke
Gruß Christian

Diese Unsitte lassen wir bitte, da du ein anderes System ansprechen willst und das Original Thema nicht beendet ist. :slight_smile:
Danke.

1 „Gefällt mir“

Danke ! Wollte nicht unhöflich sein! Aber du hast Recht. Ein extra Beitrag ist besser.
Bin mit Hilfe von ChatGPT schon etwas weiter und erhalte schon im Echo die gewünschten Ergebnisse. Morgen versuch ich dann daraus Variablen zu füllen. Falls ich mit der KI nicht weiterkomme muss ich hier noch mal nerven :stuck_out_tongue:

Mein funktionierender POST Code:

<?php

// API-URL
$apiUrl = 'http://192.168.2.61:3000/api/v1/hvac'; // Ersetze XXX.XXX.XXX.XX durch die tatsächliche IP-Adresse des Airzone Webservers

// Daten für die POST-Anfrage
$postData = array(
  "systemID" => 1, // Ersetze 1 durch die gewünschte System-ID
  "zoneID" => 1 // Ersetze 1 durch die gewünschte Zone-ID
);

// JSON-Daten erstellen
$jsonData = json_encode($postData);

// Setup cURL
$ch = curl_init($apiUrl);
curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json'
    ),
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $jsonData
));

// Send the POST request
$response = curl_exec($ch);

// Check for errors
if($response === FALSE){
    die(curl_error($ch));
}

// Close the cURL handler
curl_close($ch);

// Ausgabe der Antwort
echo "API-Antwort:\n";
echo $response;

?>

Ergebnis:

API-Antwort:
{
	"data":	[{
			"systemID":	1,
			"zoneID":	1,
			"name":	"Badezimmer",
			"thermos_type":	4,
			"thermos_firmware":	"3.60",
			"thermos_radio":	1,
			"on":	0,
			"double_sp":	0,
			"coolsetpoint":	20.5,
			"coolmaxtemp":	23,
			"coolmintemp":	15,
			"heatsetpoint":	20.5,
			"heatmaxtemp":	23,
			"heatmintemp":	15,
			"maxTemp":	23,
			"minTemp":	15,
			"setpoint":	20.5,
			"roomTemp":	18.700000762939453,
			"sleep":	0,
			"temp_step":	0.5,
			"modes":	[1, 4, 2, 3, 5],
			"mode":	3,
			"speed":	0,
			"coldStage":	1,
			"heatStage":	1,
			"coldStages":	1,
			"heatStages":	1,
			"humidity":	57,
			"units":	0,
			"errors":	[],
			"air_demand":	0,
			"floor_demand":	0,
			"cold_demand":	0,
			"heat_demand":	0,
			"heatangle":	0,
			"coldangle":	0,
			"master_zoneID":	1,
			"eco_adapt":	"off",
			"antifreeze":	0,
			"open_window":	0
		}]
}

Echt cool, wie man ohne php Wissen voran kommt.

Es funktioniert !

Alles mit Hilfe von ChatGPT. Variablen Anlegen, befüllen, Array zum schalten übergeben usw.

<?php

// Erstelle einen 60 Sec. refresh Event falls nicht vorhanden
$scriptId = $_IPS['SELF']; // Aktuelle Skript-ID
$interval = 60;  // Intervall in Sekunden

$eventName = "Zyklisches Event für Automation $scriptId";
$eventId = @IPS_GetEventIDByName($eventName, $scriptId);

if ($eventId === false) {
    // Das Ereignis existiert noch nicht, daher erstellen wir es
    $automationId = IPS_CreateEvent(0); // 0 steht für eine Automation
    IPS_SetName($automationId, "Automation für Skript $scriptId");
    IPS_SetParent($automationId, 0); // 0 steht für die Root-Kategorie
    IPS_SetEventScript($automationId, $scriptId);

    // Füge dem Skript eine Aktion hinzu
    $scriptIdToExecute = $scriptId; // Ersetze 12342 durch die tatsächliche ID deines Skripts
    IPS_SetEventScript($automationId, $scriptIdToExecute);

    // Erstelle das zyklische Ereignis, das die Automation alle 60 Sekunden auslöst
    $eventId = IPS_CreateEvent(1); // 1 steht für zyklisches Ereignis
    IPS_SetName($eventId, $eventName);
    IPS_SetParent($eventId, $scriptId);
    IPS_SetEventCyclic($eventId, 0, 0, 0, 0, 1, $interval); // Setze das Intervall auf 60 Sekunden
    IPS_SetEventActive($eventId, true);
    
    // Konfiguriere die Aktion, um die Automation auszuführen
    IPS_SetEventTrigger($eventId, 1, $automationId); // Setze die Automation-ID
}


// API-URL
$apiUrl = 'http://192.168.2.61:3000/api/v1/hvac';

// Daten für die POST-Anfrage
$postData = array(
  "systemID" => 1, // Ersetze 1 durch die gewünschte System-ID
  "zoneID" => 1 // Ersetze 1 durch die gewünschte Zone-ID
);

// JSON-Daten erstellen
$jsonData = json_encode($postData);

// Setup cURL
$ch = curl_init($apiUrl);
curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json'
    ),
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $jsonData
));

// Send the POST request
$response = curl_exec($ch);

// Check for errors
if ($response === FALSE) {
    die(curl_error($ch));
}

// Close the cURL handler
curl_close($ch);

// JSON-Daten dekodieren
$data = json_decode($response, true);

// Überprüfen, ob die Daten gültig sind
if ($data === null) {
    die('Fehler beim Dekodieren der JSON-Daten.');
}

// Den ersten Datensatz auswählen (es könnte mehrere geben)
$data = $data['data'][0];

// Variable erstellen oder aktualisieren
function createOrUpdateVariable($name, $value, $type)
{
    $variableID = @IPS_GetVariableIDByName($name, $_IPS['SELF']);
    
    if ($variableID === false) {
        $variableID = IPS_CreateVariable($type);
        IPS_SetName($variableID, $name);
        IPS_SetParent($variableID, $_IPS['SELF']);
    }
    
    SetValue($variableID, $value);
}

// Die API-Antwortdaten in Variablen schreiben
createOrUpdateVariable('SystemID', $data['systemID'], 1); // Integer
createOrUpdateVariable('ZoneID', $data['zoneID'], 1); // Integer
createOrUpdateVariable('Name', $data['name'], 3); // String
//createOrUpdateVariable('ThermosType', $data['thermos_type'], 1); // Integer
createOrUpdateVariable('Status', $data['on'], 0); // Boolean
//createOrUpdateVariable('DoubleSP', $data['double_sp'], 0); // Boolean
//createOrUpdateVariable('CoolSetpoint', $data['coolsetpoint'], 2); // Float
//createOrUpdateVariable('CoolMaxTemp', $data['coolmaxtemp'], 2); // Float
//createOrUpdateVariable('CoolMinTemp', $data['coolmintemp'], 2); // Float
//createOrUpdateVariable('HeatSetpoint', $data['heatsetpoint'], 2); // Float
//createOrUpdateVariable('HeatMaxTemp', $data['heatmaxtemp'], 2); // Float
//createOrUpdateVariable('HeatMinTemp', $data['heatmintemp'], 2); // Float
//createOrUpdateVariable('MaxTemp', $data['maxTemp'], 2); // Float
//createOrUpdateVariable('MinTemp', $data['minTemp'], 2); // Float
createOrUpdateVariable('Solltemperatur', $data['setpoint'], 2); // Float
createOrUpdateVariable('Raumtemperatur', $data['roomTemp'], 2); // Float
createOrUpdateVariable('Sleep', $data['sleep'], 0); // Boolean
createOrUpdateVariable('Luftfeuchtigkeit', $data['humidity'], 2); // Float
// Füge hier weitere Variablen hinzu...


// Ausgabe der Antwort
//echo "API-Antwort:\n";
//echo $response;

Sehr cool, dass ChatGPT die ganze ipsymcon Befehlsreferenz kennt :stuck_out_tongue: Ich bin mega Happy mit dem Ergebnis.

Das ist ja unglaublich… was hast Du bei dem Schlaumeier genau angefragt? Mit einem Hinweis auf dem Namen IP-Symcon?

Erstmal sage ich ihm: Du bist ein PHP Programmierer und kennst dich gut in ipsymcon aus. Nutze die Befehlsreferenz von ipsymcon.
Dann habe ich ich ihm per copy paste die wichtigsten Passagen aus der API Doku von Airzone gegeben und ein spezielles Array vorgegeben um Werte zu erhalten. Darauf hin hat er das gröbste des Scriptes bereitgestellt. Nach ein… zwei kleinen Problemchen hat er dann ein funktionierendes Script ausgespuckt was vernünftige Werte über ein Echo ausgegeben hat. Dann habe ich gesagt, er soll das script so erweitern, dass beim erstmaligen ausführen für alle Werte entsprechende Variablen anlegt und diese befüllt. Im Anschluss sollte er dann noch ein Event mit 60 sec. Ausführung hinzufügen. Ich musste nicht mal definieren welche Variablen Bool oder String etc sind. Hat er alles korrekt erstellt.

Beispiel:

1 „Gefällt mir“

Irgend wie Gruselig, was da noch kommt. Vielversprechend.