[Solved] Exec binding - php Script - Ab und zu ein Fehler ??

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
AlcedoAttis
Beiträge: 10
Registriert: 13. Mai 2018 20:10
Answers: 0

[Solved] Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von AlcedoAttis »

Hallo zusammen,

ich möchte die Sensoren meiner Alarmanlage (AA) via Openhab nutzen um Aktionen ZB via KNX zu triggern (z.B. wenn Sensor Garagentor beim Sonnenuntergang noch offen, dann mach das Tor zu). Zunächst versuche ich das Ergebnis in einer Sitemap darzustellen.
Die AA ist eine Lupus XT2 und kann via php und REST API ausgelesen werden.
Ein prima Skript gibt es hier, das ich leicht verändert habe, um für einen Sensor die Ausgabe "ZU" oder "OFFEN" zu bekommen: https://www.symcon.de/forum/threads/296 ... s-auslesen.

Das php Skript gibt im Browser aufgerufen (XAMPP/Apache) das richtige Ergebnis aus "ZU".
Wenn ich das Skript allerdings mit dem Exec binding aufrufe, erhalte ich im log Errormeldungen aus dem php Skript.

Das Spannende: Selten gibt es einen Wert "ZU" aus, meist aber nur Errormeldungen, ohne dass das Tor bewegt wurde o.ä. Hält ggf. der Wert aus php "nicht lange genug", muss ich Updatefrequenzen ändern? Was mache ich falsch?

Mein Thing:

Code: Alles auswählen

Thing exec:command:TorExec [command="C:/php/php.exe C:/openHAB2/conf/scripts/Lupus3.php",interval=45, timeout=5, autorun=true]
Items:
String TorExecExitOutput {channel="exec:command:TorExec:output"}[/code]

Map:

Code: Alles auswählen

Text item=TorExecExitOutput
Log (hier das Bsp. wo gerade der Wert von "ZU" in ein PHP arning wieder gewechselt ist):

Code: Alles auswählen

20:13:09.518 [INFO ] [smarthome.event.ItemStateChangedEvent] - TorExecExitOutput changed from ZU to PHP Warning:  Invali                       d argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 43
PHP Warning:  ksort() expects parameter 1 to be array, null given in C:\OpenHAB2\conf\scripts\Lupus3.php on line 48
PHP Warning:  Invalid argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 56
PHP Warning:  Invalid argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 91
PHP Warning:  Invalid argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 43
PHP Warning:  ksort() expects parameter 1 to be array, null given in C:\OpenHAB2\conf\scripts\Lupus3.php on line 48
PHP Warning:  Invalid argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 56
PHP Warning:  Invalid argument supplied for foreach() in C:\OpenHAB2\conf\scripts\Lupus3.php on line 91
Hier noch das komplette php Skript, das ich nutze, wegen der Zeilennummern aus der Fehlermeldung (obwohl es IMMER den richtigen Wert einzeln aufgerufen ausgibt).

Code: Alles auswählen

<?php
// Dieses Script liest die Sensoren und deren Daten aus einer Lupus XT2 Plus aus und stellt die Stati in einer Tabelle im Webfront dar 

// Variablen definieren 
$username     = "XX"; 
$password     = "XX"; 
$ip            = "192.XXX"; 
$url             = 'http://'.$ip.'/'; 
//$id_html     = 44077 /*[Alarmanlage\Sensoren\Sensoren]*/; // String-Variable mit Profil "~HTML-Box" für die Anzeigen im Webfront 

// Gerätetypen 
$typen         = array("2" => "Fernbedienung", "4" => "Türkontakt", "5" => "Wassermelder", "9" => "IR", "11" => "Rauchmelder", "16" => "Tag Reader", "37" => "Keypad", "46" => "Sirene", "58" => "Hitzemelder"); 

// ----------------------------------------------------------------------------- 
// ab hier ist nichts mehr anzupassen 

// Login 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
$result=curl_exec ($ch); 


// Sensorliste lesen 
$sensorliste = "http://".$ip."/action/deviceListGet"; 
curl_setopt($ch, CURLOPT_URL,$sensorliste); 
$result=curl_exec ($ch); 
// echo $result; 
curl_close ($ch); 


// Umwandeln von JSON in ein Array 
$result = str_replace("\t", "", $result); 
$json = json_decode($result, true); 
// print_r($json); 


// jeweilge Zone als Index des neuen Arrays $sensoren verwenden und dieses nach Index (=Zone) sortieren 
foreach ($json['senrows'] as $sensor) 
    { 
   $zone = $sensor['zone']; 
  $sensoren[$zone] = $sensor; 
    } 
ksort($sensoren); 
// print_r($sensoren); 


// HTML-Ausgabe erstellen 
$html = "<table width='90%' align='left'>"; // Farbe anpassen oder style entfernen 
$html .= "<tr><td><b>Area</b></td><td><b>Zone</b></td><td><b>Typ</b></td><td><b>SID</b></td><td><b>Name</b></td><td><b>Zustand</b></td><td><b>Batterie</b></td><td><b>Stärke</b></td></tr>"; 

foreach ($sensoren as $sensor) 
    { 
    // Daten aus Array zur besseren Anzeige bearbeiten 
    $status = @GetTextBetween($sensor['status'], '{WEB_MSG_DC_', '}'); 
    $status = str_replace("CLOSE", "ZU", $status); 
    $status = str_replace("OPEN", "OFFEN", $status); 
    $rssi = substr($sensor['rssi'], -1); 
    $name =  utf8_decode($sensor['name']); 
    $battery = str_replace("0", "Schwach", $sensor['battery_ok']); 
    $battery = str_replace("1", "OK", $sensor['battery_ok']); 
     
    // Zeilen mit Daten befüllen 
    $html .= "<tr>"; 
    $html .= "<td>" . $sensor['area'] . "</td>";        // area 
    $html .= "<td>" . $sensor['zone'] . "</td>";        // zone 
    $html .= "<td>" . $typen[$sensor['type']] . "</td>";        // typ 
    $html .= "<td>" . $sensor['sid'] . "</td>";        // sid 
    $html .= "<td>" . $name . "</td>";        // name 
    $html .= "<td>" . $status . "</td>";        // status 
    $html .= "<td>" . $battery . "</td>";        // battery_ok 
    $html .= "<td>" . $rssi . "</td>";        // rssi 
    $html .= "</tr>"; 
    } 

// ----------------------------------------------------------------------------- 
function GetTextBetween($string, $start, $end) 
    { 
   preg_match_all( "/$start(.*)$end/U", $string, $match ); 
   return $match[1][0]; 
    } 
	
// HTML-Ausgabe 2 erstellen 
$html = "<table width='90%' align='left'>"; // Farbe anpassen oder style entfernen 
$html .= "<tr><td><b>Area</b></td><td><b>Zone</b></td><td><b>Typ</b></td><td><b>SID</b></td><td><b>Name</b></td><td><b>Zustand</b></td><td><b>Batterie</b></td><td><b>Stärke</b></td></tr>"; 

foreach ($sensoren as $sensor) 
	{	
        if ($sensor['sid'] == "RF:0149e510") {
	echo $status;
} else {
}
	}
?>

Danke Euch !
Zuletzt geändert von AlcedoAttis am 18. Mai 2018 13:38, insgesamt 1-mal geändert.

AlcedoAttis
Beiträge: 10
Registriert: 13. Mai 2018 20:10
Answers: 0

Re: Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von AlcedoAttis »

Hi, keiner eine Idee ?

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

Re: Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von udo1toni »

Funktioniert denn das Script, wenn Du es vom cmd Prompt aus aufrufst?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

AlcedoAttis
Beiträge: 10
Registriert: 13. Mai 2018 20:10
Answers: 0

Re: Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von AlcedoAttis »

Ja es läuft prima durch, sowohl vom cmd als auch im Browser (XAMPP/Apache zB)

Was ich inzwischen herausgefunden habe: Die Frequenzen, mit der es wechselt zwischen Error und richtiger Anzeige hängen zusammen mit intervall und timeout, allerdings nicht linear. Kann es sein, dass das Item den Wert verliert (warum auch immer) und erst beim nächsten Update wieder einen Wert zugewiesen bekommt?

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

Re: Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von udo1toni »

Naja, das Item bekommt ja die Fehlermeldung zugewiesen.

Mit dem php hab ich keinen Schimmer, damit hab ich mich noch nie auseinander gesetzt.
Allerdings macht das Script ja auch nichts anderes, als die Anlage per http abzufragen. Als Antwort kommt dann wohl ein JSON Array.

Die Frage wäre, ob ein abgespecktes Script, welches einfach dieses JSON an openHAB übergibt, vielleicht sinnvoller wäre.
Das JSON speicherst Du in einem String Item und erstellst dann eine Rule, die bei Änderung des Items getriggert wird. Die Rule setzt dann mehrere (Contact) Items (eben für jeden Sensor), so dass Du auf einen Schwung alle Informationen in openHAB hast. Vielleicht fallen da auch weitere Infos raus, wie z.B. ob ein Alarm ausgelöst wurde, ob die Anlage scharf ist, auf Notstrom läuft usw.
Wenn Du mehrere Sensoren über das php script abfragst, wird auch die Menge an Abfragen relativ groß und auch die Frequenz der Abfragen steigt dann. wenn Du das JSON innerhalb openHAB auspackst, sparst Du Dir da viele Abfragen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

AlcedoAttis
Beiträge: 10
Registriert: 13. Mai 2018 20:10
Answers: 0

Re: Exec binding - php Script - Ab und zu ein Fehler ??

Beitrag von AlcedoAttis »

Ja, macht Sinn.
Und das war dann auch die Lösung. Die Fehlerquelle war leider nicht in exakt den Zeilen, die zuerst angegeben waren, sondern in einem foreach() php Befehl. Abspecken und einzeln wieder aufbauen hat mich drauf gebracht.

Antworten