Funksteckdosen 433 MHz und openHab

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

SchroedingerKatz
Beiträge: 8
Registriert: 15. Jan 2024 12:19
Answers: 0

Funksteckdosen 433 MHz und openHab

Beitrag von SchroedingerKatz »

Hallo zusammen,

ich hab vor ein paar Tagen angefangen mich mit openHab zu beschäftigen und komme einfach nicht weiter mit der Einbindung der Funksteckdosen in openHab.

openHab4:milestone läuft bei mir im CasaOS-Docker auf nem RasPi. Frontail dazu um die Logs zu sehen.
Am RasPi angeschlossen ist ein kleiner 433 MHz Sender um aktuell 3 Funksteckdosen zu steuern.
Grundlage ist die Anleitung von : https://klenzel.de/1556#
Angesprochen werden die mit raspberry-remote, was im SSH-Fenster über die Windows PS ohne Probleme funktioniert.

Nun würde ich gerne die Funksteckdosen über openHab steuern. Laut der Anleitung von https://klenzel.de/3106, habe ich den Ordner "scripts" im Rootverzeichnis erstellt, die Ausführung erlaubt und dem Besitzer "openhab" zugeordnet. Das hinterlegte Script "lampe.sh läßt sich ausführen und schaltet auch die Funksteckdosen.

Laut Anleitung soll man ein Item erstellen, in dem Fall Funkdose 3, ( Switch LEDS_WZ <lightbulb> (grp_Lampen) { exec=">[ON:/scripts/lampe.sh 010101 3 1] >[OFF:/scripts/lampe.sh 01010 3 0]" } ), was ich auch getan habe. Das Item wird dann später in die Sitemap eingetragen.

Exec-Binding, Exec-Transformation und Regex-Transformation ist installiert.

Wenn ich nun den "Schalter" im Item betätige passiert gar nichts. Leider wird in der Anleitung nichts von einem Thing gesagt.

Wo liegt mein Denkfehler bzw. was mache ich falsch ?

Danke im voraus für Eure mithilfe.
openHab4:milestone in CasaOS auf RasPi 3B+ mit Raspbian (bullseye)

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

Re: Funksteckdosen 433 MHz und openHab

Beitrag von udo1toni »

Herzlich willkommen im openHAB Forum!

Die verlinkte Anleitung bezieht sich auf openHAB1, denn ab openHAB2 wird das exec Binding anders konfiguriert.

openHAB funktioniert mit zwei Abstraktionsebenen, die eine ist rein openHAB-intern, das sind die Items.
Die andere Ebene verbindet die "Außenwelt" mit den Items, das sind die Channel.
Ein Channel ist immer Teil eines Things.
Wenn Du in openHAB4 also per exec ein externes Script steuern möchtest, dann musst Du zum ersten das exec Addon installieren, zum zweiten ein exec Thing anlegen, über das die Steuerung und ggf. Rückmeldung erfolgt, zum dritten müssen ein paar Links zwischen Items und exec Channels eingerichtet werden und nicht zuletzt muss noch der Aufruf für das Script zusätzlich zum exec Thing noch in einer Whitelist hinterlegt werden. Die Whitelist dient als Absicherung, dass nur autorisierte Befehle auch tatsächlich ausgeführt werden.

Eventuell lassen sich die Funksteckdosen auch direkt einbinden, da kommt es natürlich sehr auf das verwendete Modell (bzw. das verwendete Protokoll) an.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SchroedingerKatz
Beiträge: 8
Registriert: 15. Jan 2024 12:19
Answers: 0

Re: Funksteckdosen 433 MHz und openHab

Beitrag von SchroedingerKatz »

Hallo udo1toni,

danke für Deinen Empfang im Forum.

Ich bin zufällig auf openHab gestoßen, nachdem ich mich mit CasaOS und PiHole beschäftigt hatte. Die Idee dahinter, alles an einem Ort zu haben finde ich sehr interessant, auch wenn ich später wohl auf einen 2ten Pi zurück greifen muß. Genauso zufällig bin ich auf das kleine Projekt von Klenzel gestoßen und die Möglichkeit das ganze mit openHab zu verbinden.

Dachte mir schon sowas, das es sich wohl um eine ältere Anleitung handelt, weil die meisten neueren HowTo's zum Thema openHab anders aussehen.
Leider konnte ich als Neuling keine funktionierende Lösung ableiten.

In der Shell selber kann ich z. B. mit dem command send 01010 1 1 die 1te Dose an- und mit 0 am ende wieder ausschalten.
Dafür kommt wiringPi und raspberry-remote zum Einsatz. Von letzterm stammt das "send" command, welches in /usr/local/bin/ liegt.
Hardwareseitig habe ich den FS1000a Transmitter, sowie auch noch ein Empfänger-Modul angeschlossen. Das Empfänger-Model soll später in einem nachfolgenden Arbeitsgang zum Daten-Empfang eines Außentemperatur-Sensors dienen.

Jetzt stellt sich mir die Frage wie ich die Funksteckdosen anbinden kann.
openHab4:milestone in CasaOS auf RasPi 3B+ mit Raspbian (bullseye)

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

Re: Funksteckdosen 433 MHz und openHab

Beitrag von udo1toni »

Und was für Steckdosen schaltest Du damit?
Da gibt es ja auch verschiedenste Modelle, bzw. evtl. muss man vor dem send 01010 1 1 noch irgendwo konfigurieren, welches Funkprotokoll zum Einsatz kommt?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SchroedingerKatz
Beiträge: 8
Registriert: 15. Jan 2024 12:19
Answers: 0

Re: Funksteckdosen 433 MHz und openHab

Beitrag von SchroedingerKatz »

Ich sag jetzt einfach mal ganz normale FSD mit Fernbedienung ala Brennenstuhl, welche man im Urwald oder in der Bucht für kleines Geld bekommen kann. Hatte die noch im Schrank und erfreulicherweise funktionieren sie noch.
Die werden mit DIP-Schalter auf den Hauscode eingestellt (01010) und mit einer zweiten DIP-Schalter-Reihe wird die Dose definiert, von 1-5.
In meinem Fall habe ich aktuell nur 3 Stück, also 1-3. Die letzte Zahl schaltet ein (1) oder aus (0). Es ist keine weitere Einstellung für ein Funkprotokoll oder ähnliches notwendig.
openHab4:milestone in CasaOS auf RasPi 3B+ mit Raspbian (bullseye)

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

Re: Funksteckdosen 433 MHz und openHab

Beitrag von udo1toni »

Ok, es gibt verschiedene Optionen, mein Rat wäre, nimm eine Rule dafür.
Da die Steckdosen ohnehin keine Rückmeldung über ihren Schaltzustand geben, läuft es darauf hinaus, dass Du einfach die Befehle sendest, wie es gebraucht wird.
Vier Items:

Code: Alles auswählen

Group gSteckdosen "433 MHz Steckdosen"
Switch Steckdose_1 "Steckdose 1" (gSteckdosen)
Switch Steckdose_2 "Steckdose 2" (gSteckdosen)
Switch Steckdose_3 "Steckdose 3" (gSteckdosen)
Die Label sind egal, die Namen der Items müssen hinten abgesetzt die Nummer der Steckdose beinhalten (die Rule verwendet diesen Teil des Namens)
Eine Rule:

Code: Alles auswählen

rule "433 MHz Steckdosen schalten"
when
    Member of gSteckdosen received command
then
    val iCommand = if(receivedCommand == ON) 1 else 0
    val strSteckdose = triggeringItem.name.split("_").get(1)
    executeCommandLine("/scripts/lampe.sh 010101", strSteckdose, iCommand);
end
Die Rule kümmert sich um alle drei Steckdosen auf einmal :)
Wenn einer der Schalter betätigt wird, löst dies ein Command trigger aus. Dieser Trigger wird auch an die Gruppe übertragen, der das Item angehört.
Die Rule triggert nun, weil einer der Schalter betätigt wurde.
Innerhalb der Rule wird zum Einen ausgewertet, welcher Befehl gesendet wurde (ON oder OFF). Abhängig davon wird die lokale Konstante iCommand auf 1 oder 0 gesetzt.
Weiterhin wird aus dem Namen des Items, welches den Trigger verursacht hat der hintere Namensteil in der lokalen Konstanten strSteckdose gespeichert.
Nun muss nur noch das script aufgerufen werden, was in der letzten Zeile passiert. dabei werden die beiden Konstanten übergeben, so dass die richtige Steckdose angesteuert wird.

Die Lösung mit der Rule ist in diesem Fall die einfachste Variante.
Du kannst die Rule auch direkt über die UI erstellen, dabei kannst Du z.B. auch Blockly verwenden. Die Textliche Definition ist hier im Forum aber besser lesbar, weshalb ich diese Form hier gerne nutze.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SchroedingerKatz
Beiträge: 8
Registriert: 15. Jan 2024 12:19
Answers: 0

Re: Funksteckdosen 433 MHz und openHab

Beitrag von SchroedingerKatz »

Erst einmal vielen Dank für die Hilfe, da wäre ich niemals drauf gekommen.

Der erste Teil mit den Items hab ich hin bekommen, aber bei der Rule hab ich versagt, lach.
Zumindest zeigt mir Frontail eine Fehlermeldung bei der Ausführung.

Code: Alles auswählen

2024-01-16 11:41:41.950 [ERROR] [b.automation.script.javascript.stack] - Failed to execute script:
org.graalvm.polyglot.PolyglotException: SyntaxError: <eval>:1:4 Expected ; but found iCommand
val iCommand = if(receivedCommand == ON) 1 else 0
    ^
<eval>:2:8 Expected ; but found strSteckdose
    val strSteckdose = triggeringItem.name.split("_").get(1)
        ^
	at org.graalvm.polyglot.Context.eval(Context.java:399) ~[?:?]
	at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458) ~[?:?]
	at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426) ~[?:?]
	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262) ~[java.scripting:?]
	at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:53) ~[?:?]
	at org.openhab.automation.jsscripting.internal.scriptengine.InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.eval(InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.java:78) ~[?:?]
	at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:53) ~[?:?]
	at org.openhab.automation.jsscripting.internal.scriptengine.InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.eval(InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.java:78) ~[?:?]
	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.lambda$0(ScriptActionHandler.java:71) ~[?:?]
	at java.util.Optional.ifPresent(Optional.java:178) [?:?]
	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.execute(ScriptActionHandler.java:68) [bundleFile:?]
	at org.openhab.core.automation.internal.RuleEngineImpl.executeActions(RuleEngineImpl.java:1188) [bundleFile:?]
	at org.openhab.core.automation.internal.RuleEngineImpl.runRule(RuleEngineImpl.java:997) [bundleFile:?]
	at org.openhab.core.automation.internal.TriggerHandlerCallbackImpl$TriggerData.run(TriggerHandlerCallbackImpl.java:87) [bundleFile:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
	at java.lang.Thread.run(Thread.java:840) [?:?]
2024-01-16 11:41:41.963 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '433Switch' failed: org.graalvm.polyglot.PolyglotException: SyntaxError: <eval>:1:4 Expected ; but found iCommand
val iCommand = if(receivedCommand == ON) 1 else 0
    ^
<eval>:2:8 Expected ; but found strSteckdose
    val strSteckdose = triggeringItem.name.split("_").get(1)
openHab4:milestone in CasaOS auf RasPi 3B+ mit Raspbian (bullseye)

oh73
Beiträge: 286
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Funksteckdosen 433 MHz und openHab

Beitrag von oh73 »

Hallo,
hat mich interessiert, habe deshalb mal die Rule bei mir Versucht.

musste klein bisschen abändern,

Code: Alles auswählen

rule "433 MHz Steckdosen schalten"
when
    Member of gSteckdosen received command
then
    val iCommand = if(receivedCommand == ON) '1' else '0'
    val strSteckdose = triggeringItem.name.split("_").get(1)
    executeCommandLine("/scripts/lampe.sh","010101", strSteckdose, iCommand);
end
bei der if Abfrage die 1 und die 0 in Hochkomma gesetzt
und bei dem Befehl executeCommandLine darf kein Leerzeichen hinter lampe.sh sein, Leerzeichen mit "," ersetzen.

die Rule funktioniert so, ob die Lampe aber geschaltet wird weiß ich nicht, weil ich nicht weiß was in dem Script lampe.sh steht?

ich habe nur mal ein sh Script erstellt was mir die Parameter zum kontrollieren in eine Log Datei schreibt.

Code: Alles auswählen

#!/bin/bash

echo $1 >> /var/www/html/var.txt
echo $2 >> /var/www/html/var.txt
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: Funksteckdosen 433 MHz und openHab

Beitrag von udo1toni »

Die Rule ist eine DSL Rule, man kann die auch über die UI erstellen, aber der Code sieht dann etwas anders aus (weil der eigentliche Code nur den Part zwischen then und end umfasst). Sieht als yaml Code (Codeansicht der Rule) so aus:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      groupName: gSteckdosen
    type: core.GroupCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        val strCommand   = if(receivedCommand == ON) "1" else "0"
        val strSteckdose = triggeringItem.name.split("_").get(1)
        executeCommandLine("/scripts/lampe.sh","010101", strSteckdose, strCommand)
    type: script.ScriptAction
Ganz wichtig ist dabei, die richtige Sprache auszuwählen, DSL, nicht JavaScript-
In JavaScript muss jeder Befehl mit einem Semikolon abgeschlossen werden, in der DSL gibt es nur einen einzigen Befehl, bei dem das Semikolon gebraucht wird, nämlich return;
Du kannst den Code von oben einfach statt des bestehenden yaml Codes in Deine Rule einfügen und speichern, dann sollte es passen.

Wegen der Anführungszeichen... ich hätte erwartet, dass openHAB hier automatisch ein .toString verwendet, aber im Grunde ist es ja auch egal, ob die Werte nun als String oder als Number übergeben werden...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SchroedingerKatz
Beiträge: 8
Registriert: 15. Jan 2024 12:19
Answers: 0

Re: Funksteckdosen 433 MHz und openHab

Beitrag von SchroedingerKatz »

Danke für die Antworten.

Leider will es nicht so wie ich (wir) es gerne wollen.

Da ich nicht gerade die hellste Kerze auf der Torte bin, lach, nun mal für Dummies.

Der Inhalt von lampe.sh :

Code: Alles auswählen

#!/bin/bash
/usr/local/bin/send $1 $2 $3
$1=01010, $2=Dose 1-3, $3=Ein/AUS 1/0

Ich habe nun auch noch eine Test-Rule angelegt, wie oh73 es getan hat mit der letzten Vorlage von udo1toni, damit ich die Ausgabe in einer txt Datei habe und die alte 433-Rule mit der Vorlage erneuert.

Beide Rules melden im Log einen Fehler no such File or Directory.

Code: Alles auswählen

2024-01-16 15:39:52.773 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Steckdose_1' received command ON
2024-01-16 15:39:52.779 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Steckdose_1' changed from OFF to ON
==> /logs/openhab.log <==
2024-01-16 15:39:52.996 [WARN ] [rg.openhab.core.io.net.exec.ExecUtil] - Error occurred when executing commandLine '[/scripts/lampe.sh, 01010, 1, 1]'
java.io.IOException: Cannot run program "/scripts/lampe.sh": error=2, No such file or directory


bzw.

Code: Alles auswählen

2024-01-16 16:10:17.254 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Steckdose_1' received command ON
2024-01-16 16:10:17.264 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Steckdose_1' changed from OFF to ON
==> /logs/openhab.log <==
2024-01-16 16:10:17.482 [WARN ] [rg.openhab.core.io.net.exec.ExecUtil] - Error occurred when executing commandLine '[/home/openhab/scripts/test.sh, 01010, 1, 1]'
java.io.IOException: Cannot run program "/home/openhab/scripts/test.sh": error=2, No such file or directory
In beiden Verzeichissen sind die Dateien vorhanden, von jedem Benutzer les-,schreib- und ausführbar.
Von der Konsole aus funktioniert es ohne Probleme.

Code: Alles auswählen

manekineko@kirschkuchen:~ $ sh /home/openhab/scripts/lampe.sh 01010 1 1
using pin 0
sending systemCode[01010] unitCode[1] command[1]
manekineko@kirschkuchen:~ $ sh /home/openhab/scripts/lampe.sh 01010 1 0
using pin 0
sending systemCode[01010] unitCode[1] command[0]

Code: Alles auswählen

 sh /home/openhab/scripts/test.sh 01010 1 1
manekineko@kirschkuchen:~ $ cat /var/log/lampe.txt
01010
1
1

Code: Alles auswählen

sh /scripts/lampe.sh 01010 1 1
using pin 0
sending systemCode[01010] unitCode[1] command[1]
manekineko@kirschkuchen:~ $ sh /scripts/lampe.sh 01010 1 0
using pin 0
sending systemCode[01010] unitCode[1] command[0]
openHab4:milestone in CasaOS auf RasPi 3B+ mit Raspbian (bullseye)

Antworten