Zugriff auf REST API

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Antworten
GerdTernes
Beiträge: 25
Registriert: 5. Okt 2020 15:55
Answers: 0

Zugriff auf REST API

Beitrag von GerdTernes »

Ich versuche derzeit per http auf die REST API meiner neuen openhabian Installation zuzugreifen.
Wenn ich über die openhab developer tools gehe funktioniert es und ich bekomme dern Wert zu sehen (s. Anlage).
wenn ich den http befehl gem. der Anlage jedoch eingebe tut sich nichts.
lasse ich den /state weg, zeigt das Gerät alle Daten an (anlage 2).
Wo habe ich hier den Denkfehler?

Danke im Voraus
Unbenannt.png
Unbenannt2.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15242
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Zugriff auf REST API

Beitrag von udo1toni »

Erst mal: Deine private IP-Adresse heißt nicht privat, weil sie in irgendeiner Weise schützenswert wäre. Privat bedeutet hier das exakte Gegenteil, denn die IP wird im Internet nicht geroutet. Das heißt, Niemand kann damit irgendetwas anfangen (es sei denn, er befindet sich in Deinem LAN, dann allerdings reicht eine kleine nmap Anfrage um alle Adressen und alle offenen Dienste zu erhalten).

Im Gegensatz dazu sollte man es tunlichst vermeiden, seine öffentliche IP irgendjemandem anzuvertrauen - wobei man je nach Anbieter ohnehin bei jedem Verbindungsabbruch eine andere IP zugewiesen bekommt, dennoch...

Nun zu dem konkreten Problem: Wie schickst Du die Anfrage, per Browser?
Wenn Du den curl Aufruf drüber anschaust, wird Dir auffallen, dass dort ein "Bearer" zur Authentifizierung mitgeschickt wird. Das kannst Du bei der Anfrage über den Browser nicht mitgeben, weil Du den Header der Anfrage setzen müsstest. Der "Bearer" ist letztlich ein Token, das Du über die UI (User Settings, ganz unten, ganz links auf den User, dann API-Token...) für jede Anwendung, die Zugriff erhalten soll, generieren kannst.
Das Token muss bei jeder Anfrage mitgegeben werden.
Solange es nur um das Lesen des Wertes geht, kannst Du auf das komplette Item zugreifen und Dir per JSONPATH den Wert von state liefern lassen - bis jemand von den Entwicklern merkt, dass da offensichtlich aus Versehen die Authentifizierung nicht abgefragt wird...
Die Abfrage ohne /state sollte jedenfalls nach meinem Verständnis auch nicht funktionieren, tut sie aber...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

GerdTernes
Beiträge: 25
Registriert: 5. Okt 2020 15:55
Answers: 0

Re: Zugriff auf REST API

Beitrag von GerdTernes »

ich möchte mit einem kleinen php programm darauf zugreifen.
ich möchte werte auslesen, aber auch evtl. einen schaltvorgang auslösen (mit dem php Programm).
bei meiner vorherigen installation (mein raspi hat sich leider mitsamt karte verabschiedet) ging das über den browseraufruf. ich weiss aber nicht mehr genau wie ich es gemacht haben :-(

Benutzeravatar
udo1toni
Beiträge: 15242
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Zugriff auf REST API

Beitrag von udo1toni »

Ja, grundsätzlich geht das ja auch, Du musst aber den Bearer im Header setzen. Schau Dir dazu den curl-Aufruf an, da sind die Parameter vollständig aufgeführt. Letztlich musst Du im Script das Token hinterlegen. Wenn Du es ordentlich machst, packst Du das Token in eine Konfigurationsdatei und lädst es nach, oder Du packst es zumindest an den Beginn des PHP Scripts in eine Variable und setzt es dann jeweils über die Variable in den zu versendenden Aufruf ein.

Es gibt zwei verschiedene Optionen für die Steuerung:
  • das eine ist POST (sendet einen Befehl an das Item -> es tritt in openHAB das Ereignis Item received command ein und der Befehl wird an verlinkte Channel durchgereicht),
  • das andere ist PUT .../state (setzt den Status des Items -> es tritt in openHAB das Ereignis received update ein. Bei einer Wertänderung tritt zusätzlich das Ereignis changed ein. Falls ein Channel mit dem Profile follow an das Item gelinkt ist, oder falls es sich bei einem verlinkten Channel um einen knx *-control Channel handelt, wird der Status als Befehl gewertet und vom Channel entsprechend weitergeleitet.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

oh73
Beiträge: 302
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Zugriff auf REST API

Beitrag von oh73 »

ich verbinde openhab öfters mit PHP,
zum einen lasse ich openhab Php Programme ausführen,
oder ich schreibe mit Php über die Rest Api direkt in openhab items.

hab dafür in Php eine kleine Funktion geschrieben.

Funktion,

Code: Alles auswählen

function put($url, $daten){
/*******************************************************/
		$ch = curl_init();  
		curl_setopt($ch, CURLOPT_URL,$url);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
		curl_setopt($ch, CURLOPT_ENCODING, "");
		curl_setopt($ch, CURLOPT_MAXREDIRS, 10 );
		curl_setopt($ch, CURLOPT_TIMEOUT, 0 );
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
		
		curl_setopt($ch, CURLOPT_FAILONERROR, true);                                                                    
		curl_setopt($ch, CURLOPT_POSTFIELDS, $daten);                                                                  
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
		    'Content-Type: text/plain; charset=utf-8', 
			'Accept: application/json;',
			'api-version: 1.0')                                                                       
		);                                                                                                                   
		 
		$result = curl_exec($ch);
		return $result;
	}
aufrufen mit , Beispiel,

Code: Alles auswählen

	$daten = "22";
	$url = "http://192.168.178.19:8080/rest/items/Temperatur/state"; 
	$result = put($url, $daten);
Edit:
hier noch ein Beispiel wie ich Items mit Php auslese,

Code: Alles auswählen

$response = file_get_contents('http://192.168.178.19:8080/rest/items/HZ_Power_Day');
$arr = json_decode($response, true);
$Strom_Tag = (float)$arr["state"];


$response = file_get_contents('http://192.168.178.19:8080/rest/items/HZ_Power_Monat');
$arr = json_decode($response, true);
$Strom_Monat = (float)$arr["state"];
$Strom_Monat = round($Strom_Monat, 1);

$response = file_get_contents('http://192.168.178.19:8080/rest/items/HZ_Power_Jahr');
$arr = json_decode($response, true);
$Strom_Jahr = (float)$arr["state"];
$Strom_Jahr = round($Strom_Jahr, 1);
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

GerdTernes
Beiträge: 25
Registriert: 5. Okt 2020 15:55
Answers: 0

Re: Zugriff auf REST API

Beitrag von GerdTernes »

.... bin erst heute wieder zum testen gekommen. Super. Vielen Dank. Alles klappt

Antworten