Rules und Skripts wie einsetzen?

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Rules und Skripts wie einsetzen?

Beitrag von HABuserJM »

Hausautomation wir ja immer mehr gepriesen, wer sich aber nicht auf einen Systemhersteller festlegen möchte und von diesem abhängig wird, nutzt eines der "freien" Systeme, wie node red, ioBroker oder halt openHAB.
Ich habe node red und ioBroker schon probiert und werkel nun an openHAB, da ich bei den zuvor genannten System mehr Probleme mit der Visualisierung hatte. Nun hier bei openHAB gefällt mir diese sehr gut, ich komme bei der Erstellung von Regeln nicht klar, weil ich nicht begreife, wie ich auf die Eigenschaften der Komponenten zugreife (Syntax).
Mein Problem ist : Ich hatte ein LED-Stripe mit 433 MHz Steuerung, welche aber fremde Funksignale als ihr interpretierte und das Stripe teilweise in chaotische Zustände brachte. Also habe ich mir eine WLAN-Steuerung besorgt, welche man mit Tasmota flashen kann und damit über MQTT ansprechbar ist, leider ohne passende Fernbedienung. Nun gibt es ja dafür einen "Übersetzer", die RF Bridge, welche ich über node red super steuern konnte, wenn da nicht das Visualisierungsproblem wäre.
Ich komme also irgendwie nicht klar, wie ich den RF-Code der Bridge abfange und auswerte (alles MQTT), um dann ebenfalls per MQTT das LED Stripe zu schalten.

Bubbleman
Beiträge: 120
Registriert: 22. Dez 2020 17:03
Answers: 1

Re: Rules und Skripts wie einsetzen?

Beitrag von Bubbleman »

Hi

Ein paar Gedanken in kürze:
Wenn du einen WLAN Controller hast, der mit Tasmota geflasht ist, dann brauchst du keine weitere Bridge o.ä.
Auf deinem Raspberry (oder wo OH3 läuft) einen MQTT Broker installieren, vorzugsweise mosquitto.
Tasmota auf dem Controller konfigurieren, damit der Controller in dein WLAN kommt und deinen LED Strip richtig ansteuert und MQTT konfiguriere usw.
Dann noch zB MQTT-Explorer auf deinem Rechner installieren, nicht auf dem Raspberry. Damit kannst du die MQTT Kommunikation in deinem WLAN "beobachten".
Dann in OH3 das MQTT Binding installieren, Thing konfigurieren und Item konfigurieren.

Soviel ganz grob in der kürze der Zeit.

Gruß
Thomas
OH 3.1, Raspberry 4B, 4GB RAM, 256 GB Solid State Drive via SATA <-> USB Adapter, ConBee II ZigBee Stick

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: Rules und Skripts wie einsetzen?

Beitrag von HABuserJM »

Um es etwas zu präzisieren: Ich habe ein Item "RF_Code", wo aus der JSON-Struktur

Code: Alles auswählen

{"Time":"2021-08-14T18:35:30","RfReceived":{"Sync":12290,"Low":400,"High":1240,"Data":"004C01","RfKey":1}}
der Eintrag Data extrahiert wird (JSONPATH:$.RfReceived.Data).
Ich verstehe aber nicht, was nun der Trigger ist und wie ich dann weitermache. Ein weiteres Problem wird dann auch sein, wie ich den aktuellen Zustand zwischenspeichere, da "004C01" der gleiche Code für Stripe ein und aus ist.
@Bubbleman: es geht mir um die Funkfernbedienung für 433 MHz, welche ich weiterbenutzen möchte.

Bubbleman
Beiträge: 120
Registriert: 22. Dez 2020 17:03
Answers: 1

Re: Rules und Skripts wie einsetzen?

Beitrag von Bubbleman »

HABuserJM hat geschrieben: 14. Aug 2021 18:42 @Bubbleman: es geht mir um die Funkfernbedienung für 433 MHz, welche ich weiterbenutzen möchte.
Dann kann ich leider nicht weiterhelfen.
OH 3.1, Raspberry 4B, 4GB RAM, 256 GB Solid State Drive via SATA <-> USB Adapter, ConBee II ZigBee Stick

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

Re: Rules und Skripts wie einsetzen?

Beitrag von udo1toni »

Du brauchst erst mal einen String Channel, der mit dem Topic gekoppelt ist. Du verlinkst ein String Item mit dem Channel. Dabei setzt Du den JSONPATH entsprechend ein.
Du kannst die Transformation entweder direkt in Channel eintragen oder im Item Profile. Das Item Profile hat dabei den Vorteil, dass Du weitere Items mit dem selben Channel koppeln kannst, die dann unterschiedliche Inhalte haben hönnen, weil Du jeweils unterschiedliche Transformations pro Item verwenden kannst, z.B. könntest Du auf diese Weise zusätzlich den Zeitstempel abgreifen.

Die passende Rule lässt Du auf das Item triggern, in welchem Data gespeichert wird. Und zwar nutzt Du den Trigger received update. Damit wird die Rule jedes Mal ausgelöst, wenn ein Signal über das Topic empfangen wird. Dabei spielt es keine Rolle, ob der Status sich geändert hat oder nicht.

Die Rule kann nun verschiedene Befehle auswerten, z.B. so:

Code: Alles auswählen

rule "RF Befehle auswerten"
when
    Item RF_Data received update
then
    switch(RF_Data.state.toString) {
        case "004C01" : {
            LED_Stripe_Power.sendCommand(if(LED_Stripe_Power.state != ON) ON else OFF)
        }
        case "004C02" : {
            // ein anderes Item steuern
        }
        case "004C03" : {
            // noch ein anderes Item steuern
        }
        default: {
            logInfo("receivedrf","Unbekannter RF-Befehl: {}",RF_Data.state)
        }
    }
end
Der Part mit dem default ist natürlich optional, habe ich hier nur zur Demo eingebaut. Bei jedem empfangenen Signal "004C01" wird das Item LED_Stripe_Power umgeschaltet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: Rules und Skripts wie einsetzen?

Beitrag von HABuserJM »

Vielen Dank für die Antwort.
JSON Transformationen trage ich meistens im Channel bei Incoming Value Transformations ein, da ich bisher auch immer nur ein Item vom Channel abgeleitet habe, soweit funktioniert bei mir auch Alles, der Data-Wert wird mir im Item auch korrekt angezeigt. Die Sache mit den Rules sieht bei mir aber immer anders aus, als bei dir, da ich das Ganze über die GUI mache und Du scheinbar als Datei, so wie noch vor OH3. Mein Versuch mit Blockly sieht so aus (Blockly-Code nicht enthalten):

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: SonoffRFBridge_RFCode
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      blockSource:
      type: application/javascript
      script: >
        if (itemRegistry.getItem('SonoffRFBridge_RFCode').getState() == '004C01') {
          events.sendCommand('LEDStripe_ONOFF', '1');
        }
    type: script.ScriptAction
Leider sieht es bei mir mit den Debug-Möglichkeiten auch schlecht aus, das ist in node red auch besser gestaltet, ich sehe immer nur das, was ich auch visuell auf einer Page darstellen könnte und nicht, was innerhalb passiert. Schon die Möglichkeit z.B. ein Messagefenster einzublenden würde mir helfen, da fehlt mir aber die Syntax, falls es so etwas gibt.

Was ich auch noch nicht begriffen habe: Wann oder wie werden denn die Rules angewendet, bei mir steht immer in grün "Idle" und ich kann kurz das blaue Dreieck drücken, aber es zuckt dann nur kurz und das war es.

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

Rules und Skripts wie einsetzen?

Beitrag von udo1toni »

Das ist soweit korrekt.

Du wirst nie sehen, dass eine Rule läuft. Sollte das mal der Fall sein, ist die Rule schlecht programmiert. :)

Dabei spielt es keine Rolle, welche Art Rules Du verwendest.

Deine Rule passt aber weitgehend. Nur möchtest Du ja, dass das Licht toggelt, nicht, dass es nur eingeschaltet wird.

Wo wir beim Licht sind: Musst Du tatsächlich eine 1 senden? Wenn es ich um einen Schaltkanal handelt, wäre es sinnvoll, das im Channel anzupassen, damit Du ON und OFF statt 1 und 0 verwenden kannst. Dann könntest Du auch ein Switch Item verknüpfen.

Im Zweifel erreichst Du das Toggle ähnlich wie ich in meiner Rule:

Code: Alles auswählen

events.sendCommand('LEDStripe_ONOFF', if (itemRegistry.getItem('LEDStripe_ONOFF').getState() != '1') '1' else '0');
Wobei die Zeile ungetestet ist :)

Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: Rules und Skripts wie einsetzen?

Beitrag von HABuserJM »

Leider tut sich auch nach der Änderung in "ON"´Nichts. Irgendwie vermisse ich bei Blockly die Else-Anweisung oder schreibe ich dafür eine weitere Rule? Bei mir sieht es nämlich nun so aus:

Code: Alles auswählen

script: >
        if (itemRegistry.getItem('SonoffRFBridge_RFCode').getState() ==
        '004C01') {
          if (itemRegistry.getItem('LEDStripe_ONOFF').getState() == 'OFF') {
            events.sendCommand('LEDStripe_ONOFF', 'ON');
          }
        }
und ich würde es gern so machen:

Code: Alles auswählen

script: >
        if (itemRegistry.getItem('SonoffRFBridge_RFCode').getState() ==
        '004C01') {
          if (itemRegistry.getItem('LEDStripe_ONOFF').getState() == 'OFF') {
            events.sendCommand('LEDStripe_ONOFF', 'ON');
          }
          else {
            events.sendCommand('LEDStripe_ONOFF', 'OFF');
          }
        }
wobei ich immer noch nicht glaube, dass das Skript überhaupt ausgeführt wird. Ich sehe maximal im frontai:l

Code: Alles auswählen

2021-08-15 12:25:52.584 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SonoffRFBridge_RFCode' changed from 004C08 to 004C01
, und das auch nur, wenn der letzte RFCode ungleich 004C01 war.

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

Re: Rules und Skripts wie einsetzen?

Beitrag von udo1toni »

Na, da steht ja auch ItemStateChangedEvent. Die Meldung kommt nur bei einer Wertänderung. Ein Update wurde gewöhnlich nicht protokolliert.

Wie der exakte Befehlssatz von JavaScript aussieht, kann ich Dir nicht sagen, da ich kein JavaScript nutze. Der ternäre Operator sollte aber auch da zur Verfügung stehen (vielleicht anders geschrieben…).
Schau mal nach Beispielprogrammen (im englischen Forum gibt‘s da massig Code).


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: Rules und Skripts wie einsetzen?

Beitrag von HABuserJM »

Hallo,
leider komme ich mit deiner Rule (Datei?) überhaupt nicht weiter, weil ich diese über die UI nicht so einsetzen kann, ohne

Code: Alles auswählen

[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'rf_bridge01' failed:  ___ rule  ___ "RF Befehle auswerten"
auszulösen. Die Errormeldungen die folgenden Zeilen habe ich hier mal nicht weiter ausgeführt. Ausgelöst wird dieser Error, wenn ich bei der Rule in der UI auf Run drücke, der komplette Code der Rule sieht so aus:

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: SonoffRFBridge_RFCode
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        rule "RF Befehle auswerten"

        when
            SonoffRFBridge_RFCode received update
        then
            switch(SonoffRFBridge_RFCode.state.toString) {
                case "004C01" : {
                  logInfo("rf_bridge", "Command:004C01")
                    // LED_Stripe_Power.sendCommand(if(LED_Stripe_Power.state != ON) ON else OFF)
                }
                case "004C02" : {
                  logInfo("rf_bridge", "Command:004C02")
                    // ein anderes Item steuern
                }
                case "004C03" : {
                  logInfo("rf_bridge", "Command:004C03")
                    // noch ein anderes Item steuern
                }
                default: {
                    logInfo("rf_bridge","Unbekannter RF-Befehl")
                }
            }
        end
    type: script.ScriptAction
Ich bin so langsam drauf und dran mich von Homeautomation zu verabschieden, weil jedes System ab einer gewissen Tiefe, welche unterschiedlich schnell erreicht wird, dazu führt, zuerst ein Studium abschliessen zu müssen, um auch nur die kleinsten Aufgaben umsetzen zu können.
Was kann in einem System so kompliziert sein, von einer Komponente einen Code zu empfangen und in Abhängigkeit des Wertes an eine andere Komponente einen anderen Code oder Befehl zu senden. Mit einem ESP8266 Di Mini reichen dafür wenige Zeilen C-Code, hier in openHAB 3 muss man schon danach suchen, wie man an den empfangenen Code herankommt, geschweige denn diesen verarbeitet. Das ist in meinen Augen nicht nutzerfreundlich, zumal 80% nur auf englischsprachigen Seiten zu finden ist und in Youtube-Videos auch nicht verständlicher wird, weil dort maximal das Schalten ein Lampe gezeigt wird.
Sehr schade Alles :cry: .

Antworten