Seite 1 von 2

Rules und Skripts wie einsetzen?

Verfasst: 14. Aug 2021 18:16
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.

Re: Rules und Skripts wie einsetzen?

Verfasst: 14. Aug 2021 18:37
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

Re: Rules und Skripts wie einsetzen?

Verfasst: 14. Aug 2021 18:42
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.

Re: Rules und Skripts wie einsetzen?

Verfasst: 14. Aug 2021 19:02
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.

Re: Rules und Skripts wie einsetzen?

Verfasst: 14. Aug 2021 20:52
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.

Re: Rules und Skripts wie einsetzen?

Verfasst: 15. Aug 2021 10:23
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.

Rules und Skripts wie einsetzen?

Verfasst: 15. Aug 2021 11:44
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

Re: Rules und Skripts wie einsetzen?

Verfasst: 15. Aug 2021 12:28
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.

Re: Rules und Skripts wie einsetzen?

Verfasst: 15. Aug 2021 14:16
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

Re: Rules und Skripts wie einsetzen?

Verfasst: 18. Aug 2021 11:12
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: .