Lupus XT2 Plus Status auslesen mit openHAB

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
djmg_uli
Beiträge: 38
Registriert: 10. Jan 2020 11:47
Answers: 0

Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von djmg_uli »

Hallo zusammen!

Habt ihr Erfahrung mit dem Auslesen einer Lupus XT2 Plus Alarmanlage mittels openHAB?
Möchte gerne mit diesem Status (scharf/unscharf und Stati der einzelnen Sensoren) diverse Sachen in openHAB steuern.

Ich habe es bereits geschafft, mit einem kleinen Webserver (Synology) mittels PHP (curl) das JSON der Alarmanlage auszulesen.
Anbei ein Screenshot, was ich da alles abfragen kann.

Wie bekomme ich diese Stati nun nach openHAB?
Oder brauche ich das PHP Script gar nicht z.b. und kann gleich irgendwie auf die "URL/API der Alarmanlage" mich verbinden und auslesen?

Danke für eure Tipps!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von udo1toni »

Interessanter als ein Screenshot wäre das JSON ;) Wenn Du Sorge wegen der enthaltenen Daten hast, schau mal, ob es beim Hersteller Beispieldateien gibt, oder bearbeite das JSON vorher mit einem Texteditor. Bitte nicht als Screenshot, sondern als Code einfügen (es soll ja darum gehen, die Daten zu analysieren...)
Jedenfalls kannst Du das JSON Objekt bequem mittels http Binding in einen Cache einlesen und anschließend aus diesem Cache die Items mittels JSONPATH Transformation füllen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

djmg_uli
Beiträge: 38
Registriert: 10. Jan 2020 11:47
Answers: 0

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von djmg_uli »

Hallo udo1toni, da hast du wohl vollkommen Recht :)
Nachfolgend der Code (für andere User sicherlich brauchbar) - als auch dessen Ausgabe.
Ich freue mich über deine Hilfe für den openHAB-Part.

Mittels PHP frage ich die Sensoren derzeit so ab:

Code: Alles auswählen

// 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");
$result=curl_exec ($ch);


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

Code: Alles auswählen

print_r($result);
erscheint am Display bei mir (Teilauszug aus Sicherheitsgründen)

Code: Alles auswählen

{ "senrows": [ {"area": 2, "zone": 43, "type": 33, "type_f": "{D_TYPE_33}", "name": "Garagentor", "cond": "", "cond_ok": "1", "battery": "", "battery_ok": "1", "tamper": "", "tamper_ok": "1", "bypass": 0, "rssi": "{WEB_MSG_STRONG} 8", "resp_mode": [0,0,0,0,0,0], "ammeter": "0", "ver": "", "bypass_tamper": 0, "sid": "RF:0016fd10", "su": 1, "alarm_status": "", "status_ex": "0", "hue": "-1", "sat": "-1", "ctemp": "-1", "hue_cmode": "-1", "hue_cie_x": "-1", "hue_cie_y": "-1", "hue_color_cap": "0", "nuki": "-1", "shutter_turn": 0,"status": "{WEB_MSG_DC_CLOSE}"}, {"area": 1, "zone": 7, "type": 4, "type_f": "{D_TYPE_4}", "name": "Kellertür", "cond": "", "cond_ok": "1", "battery": "", "battery_ok": "1", "tamper": "", "tamper_ok": "1", "bypass": 0, "rssi": "{WEB_MSG_STRONG} 8", "resp_mode": [0,5,1,1,1,0], "ammeter": "0", "ver": "", "bypass_tamper": 0, "sid": "RF:05671d10", "su": 1, "alarm_status": "", "status_ex": "0", "hue": "-1", "sat": "-1", "ctemp": "-1", "hue_cmode": "-1", "hue_cie_x": "-1", "hue_cie_y": "-1", "hue_color_cap": "0", "nuki": "-1", "shutter_turn": 0,"status": "{WEB_MSG_DC_CLOSE}"} ] }
-----------------------------------------------

Den Gesamtstatus gibt es mittels

Code: Alles auswählen

$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");
$alarmresult=curl_exec ($ch);


$alarmstatus = "http://".$ip."/action/panelCondGet";
curl_setopt($ch, CURLOPT_URL,$alarmstatus);
$alarmresult=curl_exec ($ch);
curl_close ($ch);

print_r($alarmresult);
und ergibt als Ausgabe:

Code: Alles auswählen

{ "updates" : { "mode_a1" : "{AREA_MODE_1}", "mode_a2" : "{AREA_MODE_1}", "fw_updated" : "0", "dc_ex" : "1", "alarm_ex" : "0", "battery_ex" : "1", "battery_ok" : "1", "battery" : "{WEB_MSG_NORMAL}", "tamper_ok" : "1", "tamper" : "{WEB_MSG_NA}", "interference_ok" : "1", "interference" : "{WEB_MSG_NORMAL}", "ac_activation_ok" : "1", "ac_activation" : "{WEB_MSG_NORMAL}", "sys_in_inst": "", "rssi" : "1", "sig_gsm_ok" : "1", "sig_gsm" : "9" }, "forms" : { "pcondform1" : { "mode" : "1", "f_arm" : "0" }, "pcondform2" : { "mode" : "1", "f_arm" : "0" } } }

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

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von udo1toni »

Ja, das sieht doch gut aus. Sauber formatiert:

Code: Alles auswählen

{
    "senrows": [
        {
            "area": 2,
            "zone": 43,
            "type": 33,
            "type_f": "{D_TYPE_33}",
            "name": "Garagentor",
            "cond": "",
            "cond_ok": "1",
            "battery": "",
            "battery_ok": "1",
            "tamper": "",
            "tamper_ok": "1",
            "bypass": 0,
            "rssi": "{WEB_MSG_STRONG} 8",
            "resp_mode": [
                0,
                0,
                0,
                0,
                0,
                0
            ],
            "ammeter": "0",
            "ver": "",
            "bypass_tamper": 0,
            "sid": "RF:0016fd10",
            "su": 1,
            "alarm_status": "",
            "status_ex": "0",
            "hue": "-1",
            "sat": "-1",
            "ctemp": "-1",
            "hue_cmode": "-1",
            "hue_cie_x": "-1",
            "hue_cie_y": "-1",
            "hue_color_cap": "0",
            "nuki": "-1",
            "shutter_turn": 0,
            "status": "{WEB_MSG_DC_CLOSE}"
        },
        {
            "area": 1,
            "zone": 7,
            "type": 4,
            "type_f": "{D_TYPE_4}",
            "name": "Kellertür",
            "cond": "",
            "cond_ok": "1",
            "battery": "",
            "battery_ok": "1",
            "tamper": "",
            "tamper_ok": "1",
            "bypass": 0,
            "rssi": "{WEB_MSG_STRONG} 8",
            "resp_mode": [
                0,
                5,
                1,
                1,
                1,
                0
            ],
            "ammeter": "0",
            "ver": "",
            "bypass_tamper": 0,
            "sid": "RF:05671d10",
            "su": 1,
            "alarm_status": "",
            "status_ex": "0",
            "hue": "-1",
            "sat": "-1",
            "ctemp": "-1",
            "hue_cmode": "-1",
            "hue_cie_x": "-1",
            "hue_cie_y": "-1",
            "hue_color_cap": "0",
            "nuki": "-1",
            "shutter_turn": 0,
            "status": "{WEB_MSG_DC_CLOSE}"
        }
    ]
}
(leichter lesbar. z.B. für VSCode gibt es dafür Plugins, die das übernehmen)
Du musst dieses JSON Objekt nach openHAB bekommen. Das Script kümmert sich auch um das Login, man könnte das sicher leicht auch mit python bauen (dann braucht es keinen extra Webserver dazu).
Beim Weg über den Webserver verwendest Du das http-Binding und einen http-Cache.
Das http Binding muss installiert sein, ebenso die jsonpath Transformation.
./services/http.cfg:

Code: Alles auswählen

# timeout in milliseconds for the http requests (optional, defaults to 5000)
#timeout=

# the interval in milliseconds when to find new refresh candidates
# (optional, defaults to 1000)
#granularity=

# whether to substitute the current time or state value into the URL
# (optional, defaults to true)
#format=

# configuration of the first cache item
#<id1>.url=
#<id1>.updateInterval=

# configuration of the second cache item  
#<id2>.url=
#<id2>.updateInterval=

# Lupus XT2 per php-Script auslesen
lupus.url=http://lupus-webserver/pfad/zum/php-script
lupus.updateInterval=30000
Der obere Teil der Datei wird bei er Installation des Bindings automatisch generiert. die letzten drei Zeilen sind das entscheidende, hier schreibst Du die Webadresse hin, mit der Du das JSON Objekt erhältst. Das Updateinterval ist in Millisekunden anzugeben. Hier sollte man einen guten Kompromiss zwischen Aktualität und Netzlast finden, keine Ahnung, ob die Lupus da bestimmte Obergrenzen hat.
Wenn Du mehrere verschiedene Scripte aufrufen möchtest (Stichwort Gesamtstatus) legst Du dafür einen zweiten cache an. Natürlich musst Du dann berücksichtigen, dass doppelt so viele Anfragen auf die Lupus einprasseln (bei gleich gesetztem Cache Updateinterval)
Am besten sollten die Cache-IDs nur englische Kleinbuchstaben und Zahlen enthalten, wobei das erste Zeichen auf jeden Fall ein Buchstabe sein muss.

Nun kannst Du Items definieren:

Code: Alles auswählen

String Alarm_Kellertuer "Keller Alarm [%s]" { http="<[lupus:30000:JSONPATH($.senrows[?(@.name=='Kellertür')].alarm_status)]" }
lupus ist der Name des http-Caches, 30000 das Updateinterval in Millisekunden (das ist unabhängig vom Cache), JSONPATH() die Transformation, welche angewendet werden soll.
$ ist das gesamte JSON Objekt, also quasi die Wurzel
senrows ist ein Kind der Wurzel (in diesem Fall das einzige) und hat mehrere Kinder (die sind mit 0 und 1 durchnummeriert, vermutlich gibt es dann noch mehr davon ;). Nun könntest Du die Nummern direkt eingeben, aber vielleicht änderst Du ja mal was an der Konfiguration... Deshalb ist es eleganter, hier einen Filter zu verwenden, in diesem Fall also nach dem Name, der hoffentlich eindeutig ist. Ansonsten könnte man natürlich auch nach der sid gehen oder area und zone zum filtern heranziehen, Hauptsache, die Zuordnung ist eindeutig. Es gibt Geräte, die das JSON hochgradig dynamisch erzeugen, in dem Sinn, dass vielleicht die Reihenfolge der Knoten variiert. Deshalb ist die direkte Verknüpfung mit der Zahl eher kritisch ;)
alarm_status ist schlussendlich das auszulesende Feld im JSON Objekt.
Nun befindet sich dieser Wert im Item Alarm_Kellertuer und wird als Status angezeigt, wenn Du das Item in eine Sitemap einbaust.

Das Item ist nur lesend - klar.

Bei logischen Feldern (z.B. battery_ok) kommt offensichtlich 0 oder 1 zurück, das sollte openHAB automatisch nach OFF/ON bzw. OPEN/CLOSED übersetzen, wenn man ein Switch bzw. Contact Item verwendet. Mit einem Mapping kann man daraus in der Anzeige dann ein OK/nicht OK machen (oder was man da halt sehen haben möchte)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

djmg_uli
Beiträge: 38
Registriert: 10. Jan 2020 11:47
Answers: 0

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von djmg_uli »

Hallo udo1toni,

herzlichsten Dank für deine lange und ausführliche Erklärung.
Es hat alles soweit geklappt, fast perfekt sogar! Nicht nur mit den einzelnen Sensoren (da frage ich übrigens .status ab, nicht .alarm_status), sondern auch die gesamte Anlage mit einem eigenen Cache. Habe beides auf 10 Sek Update Intervall gesetzt. Bei Erfolg dann gerne noch schneller.

Wie du richtig angemerkt hast, kommt aus dem JSON Objekt ja oftmals "komischer Text" retour.
Sei es eine 0 oder eine 1, oder auch gerne mal der String {WEB_MSG_DC_CLOSE}
Dies würde ich gerne in lesbare Schrift umwandeln. Leider klappt es so noch nicht ganz:
Anmerkung 2020-02-11 130926.jpg
lupus.items

Code: Alles auswählen

String      Lupus_Area1         "Lupus Area 1 [JS(lupus.js):%s]"         { http="<[lupus:1000:JSONPATH($.forms.pcondform1.mode)]" }
lupus.sitemap

Code: Alles auswählen

Default item=Lupus_Area1 label="Area 1 Scharfgeschaltet" icon="lupus"
lupus.js

Code: Alles auswählen

//LUPUS Zentrale Status: Umwandeln von "1" auf "ARMED" usw.
(function(i) {

    var status = i;
    var corrected_status = "";

    if(status=="1") {}
        corrected_status = "ARMED";
    } else {
        corrected_status = "DISARMED";       
    }
    
    return corrected_status;

})(input)
Ergibt aber im Logfile:
couldn't transform value in label because transformationService of type 'JS' is unavailable
Hast du eine Idee?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

djmg_uli
Beiträge: 38
Registriert: 10. Jan 2020 11:47
Answers: 0

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von djmg_uli »

Hab es selbst geschafft, mittels einer MAP 8-)

Code: Alles auswählen

1=ARMED
0=disarmed
und die Items dann:

Code: Alles auswählen

String      Lupus_Area2         "Lupus Area 2 [MAP(lupus.map):%s]"        { http="<[lupus:3000:JSONPATH($.forms.pcondform2.mode)]" }

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von Darkwin101 »

Die Fehlermeldung sagt das du keine Javascript Transformation installiert hast bzw. diese nicht verfügbar ist

morp
Beiträge: 1
Registriert: 26. Dez 2020 18:15
Answers: 0

Re: Lupus XT2 Plus Status auslesen mit openHAB

Beitrag von morp »

Hallo zusammen, ich bin auf der Suche nach eine Möglichkeit die Luxus XT2 Alarmanlage über Openhab ARM und DISARM zu schalten.
Könnt ihr mir da weiterhelfen?

Antworten