homebridge-http-switch

  • Moin zusammen,


    ich steuere ein Gerät mittel Web API und habe jeweils einen URL Aufruf für "Fenster auf" und "Fenster zu".

    Klappt mit diesem Plugin super:


    https://github.com/Supereg/homebridge-http-switch


    Allerdings würde ich gerne den aktuellen Status einbinden und scheitere bisher.


    Der Server liefert den Status leider nicht mit 1 und 0 zurück, sondern gibt folgenden String aus:


    t:swr s:250 e:0 ok:1 ro:0 pos:c fix:1 a:-98 fw:3.4.1-15-g3d0f mem:21824 up:45516206 ip:1001564xxx cid:Hendriks Fenster rssi:-61 time:1556438939 wm:1 wp:3 wst:3 id:600194xxxx


    Relevant ist der Punkt "pos:c" für geschlossen und "pos:o" für offen. Bei Position "pos:o" soll der Schalter den Status "an" haben.


    Hat jemand Erfahrung mit Status patterns?


    Examples for custom statusPatterns

    The statusPattern property can be used to change the phrase which is used to identify if the switch should be turned on or off. So when you want the switch to be turned on when your server sends "true" in the body of the http response you could specify the following pattern:

    Code


    However using Regular Expressions much more complex patterns are possible. Let's assume your http enabled device responds with the following json string as body, where one property has an random value an the other indicates the status of the switch:

    Code

    Then you could use the following pattern:

    Code

    More on how to build regex patterns: https://www.w3schools.com/jsref/jsref_obj_regexp.asp

  • Ich habe das nie ausprobiert und ich benutze auch das Plugin nicht, aber mein erster Versuch wäre:


    "statusPattern": "t:swr s:250 e:0 ok:1 ro:0 pos:c fix:1 a:-98 fw:3.4.1-15-g3d0f mem:21824 up:45516206 ip:1001564xxx cid:Hendriks Fenster rssi:-61 time:1556438939 wm:1 wp:3 wst:3 id:600194xxxx"


    Was allerdings voraussetzt, dass die Antwort der API immer so aussieht. Ändern sich die Werte (beispielsweise mem: 21824 zu mem: irgendwas_anderes), dann muss man mit regex arbeiten, und darin bin ich ganz, ganz, ganz schlecht.


    Könnte dann vielleicht so aussehen:

    "statusPattern": "t:swr s:250 e:0 ok:1 ro:0 pos:c fix:1 a:-98 fw:3.4.1-15-g3d0f mem:[0-9]+ up:[0-9]+ ip:1001564xxx cid:Hendriks Fenster rssi:-61 time:[0-9]+ wm:1 wp:3 wst:3 id:600194xxxx"


    Aber wie gesagt: alles nur geraten.


    Stefan

  • Hey Stefan,


    es reicht sogar nur "pos:o" einzutragen. Dann werden die übrigen Werte nicht betrachtet.
    Ich musste jedoch ein pollinginterval setzen, damit die Änderung zeitnah übertragen wird.


    Manchmal ist es leichter als gedacht. :)


    Danke & einen schönen Sonntag!


    Hendrik

  • HI habe eine frage zu dem Plugin benutze es für mein lightmanager damit ich meine Funk geräte in Homekit steuern kann funktioniert bis jetzt super.

    Nun wolte ich meine Leinwand einbinden mit dem Plugin aus auch geht aber er mir trotzdem ein fehler raus haut in der log.

    Nun weiß ich nicht an was es liegt habe den behfeln zu runter rauf fahren eingefügt aus Mein Lightmanager.


    [2020-1-26 11:00:44 AM] [Leinwand Runter] Error occurred setting state of switch: ESOCKETTIMEDOUT

    [2020-1-26 11:00:44 AM] [Leinwand Runter] { Error: ESOCKETTIMEDOUT

    at ClientRequest.<anonymous> (/usr/local/lib/node_modules/homebridge-http-switch/node_modules/request/request.js:816:19)

    at Object.onceWrapper (events.js:286:20)

    at ClientRequest.emit (events.js:198:13)

    at Socket.emitRequestTimeout (_http_client.js:662:40)

    at Object.onceWrapper (events.js:286:20)

    at Socket.emit (events.js:198:13)

    at Socket._onTimeout (net.js:442:8)

    at ontimeout (timers.js:436:11)

    at tryOnTimeout (timers.js:300:5)

    at listOnTimeout (timers.js:263:5)

    at Timer.processTimers (timers.js:223:10) code: 'ESOCKETTIMEDOUT', connect: false }

    [2020-1-26 11:00:44 AM] [Leinwand Runter] Resetting switch to OFF

    Er zeigt mir dann auch in der Home app das ausrufe zeichen .

    Aber es funktioniert Troztdem

  • He zusammen,


    bin gerade dabei meine ersten Versuche mit dem HTTP-Switch Plugin zu starten.

    Habe mir mit einem Pi 3b+ und Hyperion ein Ambilight gebaut. Soweit so gut.


    Man kann über eine Rest-API ein JSON-Command senden um verschiedene Effekte zu starten. Jetzt war mein Gedanke dass ich über das Switch Plugin verschiedene Schalter anlege dir mir dann bestimmte Effekte aufs Ambilight bringen.

    Leider weis ich nicht genau wie ich den JSON-Command maskieren muss damit das HTTP-Switch-Plugin diesen verständlich an Hyperion übermittelt.


    Anbei meine aktuelle Config des Switch-Plugins. Schalter wird in Home angezeigt aber Ambilight bleibt aus.

  • Ich schalte Hyperion wunderbar über openHAB was tadellos funktioniert. Das brachte mich auf den Gedanken, ob es das für HB nicht auch gibt.

    Kennst du das Plugin homebridge-hyperion-ng2 eventuell erspart dir das schon das gefummelt alles über http zu machen.

  • Das scheint wohl gerade heute online gegangen zu sein.

    Aber ich meine vorhin dazu Gelsen zu haben es lieber nicht zu installieren.


    Naja aktuell hab ich das Hyperion light am laufen aber auch das ng erstellt mir lediglich 2 Schalter. Ich wollte eben bestimmte Effekte schalten und dazu nichts gefunden. Deshalb die http Geschichte aber leider läuft sie nicht

  • {'command': 'effect','effect': {'name': 'MyKnight'},'priority': 1,'origin': 'My Fancy App'}

    Ich glaube, es hakt hier: das ist eigentlich kein richtiges JSON. Es müsste meiner Meinung nach lauten:

    {"command": "effect","effect": {"name": "MyKnight"},"priority": 1,"origin": "My Fancy App"}


    Also mit Anführungszeichen (") statt mit Ticks ('). Die Anführungszeichen führen dann sofort dazu, dass du das so nicht mehr config.json verwenden kannst, weil da kommt ein Anführungsteichen vorne hin und eins hinten und nicht noch jede Menge irgendwo dazwischen.


    Vielleicht geht es so:

    "body": "{\"command\": \"effect\",\"effect\": {\"name\": \"MyKnight\"},\"priority\": 1,\"origin\": \"My Fancy App\"}",


    Aus jedem Anführungszeichen in deinem JSON-String wird ein Backslash-Anführungszeichen \"


    Kann das nicht testen.



  • Funktioniert der Befehl denn im Terminal?


    curl -X POST -H 'Content-Type: application/json' -d '{"command": "effect","effect": {"name": "MyKnight"},"priority": 1,"origin": "My Fancy App"}' http://IP:PORT/json-rpc

  • Das Log vom Pi mit Hyperion schreibt


    Code
    2021-02-01T12:12:44.863 hyperiond HTTPJSONRPC  : <ERROR> Failed to parse json data from JsonRpc@::ffff:IP: Error: illegal value at Line: 0, Column: 0
    Feb  1 12:12:44 HyperBian [543]: Failed to parse json data from JsonRpc@::ffff:IP: Error: illegal value at Line: 0, Column: 0

    Sofern ich den Schalter in HK schalte

  • Jap, die curl läuft.

    Das ist schonmal cool. Was passiert denn, wenn du das ausführst? Du bekommst du bestimmt eine Antwort zurück.

    2021-02-01T12:12:44.863 hyperiond HTTPJSONRPC : <ERROR> Failed to parse json data from JsonRpc@::ffff:IP: Error: illegal value at Line: 0, Column: 0

    Für mich schwer zu deuten, da ich von Hyperion null Plan habe. Was ich da lese heißt für mich, dass sich hyperiond beklagt. Offenbar läuft auf dem Raspi eine Serversoftware namens hyperiond, die da irgendwas steuert. Ich rate mal weiter und denke, dass sie in deinem Request kein (valides) JSON findet: Error: illegal value at Line: 0, Column: 0. Hört sich albern an, dass sich in Zeile 0 deines Requests und dort in Zeile 0 ein illegaler Wert befindet, aber Programmierer fangen nun mal gern bei 0 an zu zählen.


    Das kann bedeuten:

    • da ist gar nichts angekommen, weil der JSON-String unterschlagen wurde. Hmmm, vielleicht.
    • der JSON-String ist falsch. Wahrscheinlicher. Immerhin sind in deiner Homebridge-Konfiguration eine Menge Ticks (') statt Anführungszeichen (") drin - in dem curl-Befehl ist das anders!

    Um das du validieren, müsste man den curl-Befehl so schreiben, wie du das in deiner Homebridge-Konfiguration gemacht hast und sieht dann, was der Server antwortet, also:


    curl -X POST -H 'Content-Type: application/json' -d "{'command': 'effect','effect': {'name': 'MyKnight'},'priority': 1,'origin': 'My Fancy App'}" http://IP:PORT/json-rpc

    Logs mitlesen hilft enorm. Vielleicht steht ja auch ein Hinweis im Homebridge-Log.

  • So sschuste hab den curl mal abgefeuert


    Folgender Log in Hyperion


    Code
    Feb 01 17:22:49 HyperBian hyperiond[546]: 2021-02-01T17:22:49.328 hyperiond HTTPJSONRPC  : <ERROR> Failed to parse json data from JsonRpc@::ffff:IP: Error: unterminated object at Line: 0, Column: 2
    Feb 01 17:22:49 HyperBian [546]: Failed to parse json data from JsonRpc@::ffff:IP: Error: unterminated object at Line: 0, Column: 2

    Also ich vermute das dein Gedanke


    Zitat
    • da ist gar nichts angekommen, weil der JSON-String unterschlagen wurde. Hmmm, vielleicht.
    • der JSON-String ist falsch. Wahrscheinlicher. Immerhin sind in deiner Homebridge-Konfiguration eine Menge Ticks (') statt Anführungszeichen (") drin - in dem curl-Befehl ist das anders!

    1 hier zutrifft. Hab meine HB-Config auf die " angepasst aber es wird nichts übermittelt.

    Gibt es den die Möglichkeit diese curl als Switch anzulegen?

    Einmal editiert, zuletzt von redbull2906 () aus folgendem Grund: Ein Beitrag von redbull2906 mit diesem Beitrag zusammengefügt.

  • in der Erklärung zum Switch-Plugin steht ja


    Zitat
    • body <any> optional: Defines the body sent with the http request. If value is not a string it will be converted to a JSON string automatically.

    Also müsste er doch eigentlich, mit der " formartierung, zurecht kommen?!


    Unter den Plugin Issue auf GitHub hatte gestern auch schon jemand dieses Frage gestellt, wie man denn Json richtig schreiben muss aber bislang keine Antwort erhalten.


    Zitat

    Das ist schonmal cool. Was passiert denn, wenn du das ausführst? Du bekommst du bestimmt eine Antwort zurück.

    Das wäre die Antwort im Terminal auf den curl. Leider keine Logs bzgl. Schalter in HK

    Code
    {
        "command": "effect",
        "success": true,
        "tan": 0
    }

    Einmal editiert, zuletzt von redbull2906 () aus folgendem Grund: Ein Beitrag von redbull2906 mit diesem Beitrag zusammengefügt.

  • Gibt es den die Möglichkeit diese curl als Switch anzulegen?

    Klar, und um es einfach zu machen, würde ich so vorgehen: schreib ein Script.


    sudo nano /usr/local/bin/switch-on.sh

    Bash
    #!/bin/bash
    curl -X POST -H 'Content-Type: application/json' -d '{"command": "effect","effect": {"name": "MyKnight"},"priority": 1,"origin": "My Fancy App"}' http://IP:PORT/json-rpc

    Abspeichern und beenden, dann ausführbar machen mit:

    chmod +x /usr/local/bin/switch-on.sh


    Testen mit:

    switch-on.sh


    In Homebridge konfigurieren für beispielsweise homebridge-cmdtrigger:

    Code
         {
                "accessory": "CmdTrigger",
                "name": "Funzel an",
                "command": "/usr/local/bin/switch-on.sh"
            },
  • Ruhig bleiben.