FHEM Befehl von Homematic CCU aufrufen

Begonnen von zap, 11 Oktober 2015, 12:58:44

Vorheriges Thema - Nächstes Thema

zap

Hier mal ein kleines Script, mit dem man FHEM Befehle aus einer Homematic CCU aufrufen kann:


#!/bin/sh

FHEM_SERVER="myfhemserver"
FHEM_PORT=7072
NCPATH="/etc/config/addons/scripts"

if [ $# -ne 1 ]; then
echo "Usage: fhem.sh Command"
exit 1
fi

echo -e "$1\nquit\n" | $NCPATH/nc $FHEM_SERVER $FHEM_PORT


Das Script benötigt auf der CCU den Befehl netcat (nc). Die notwendigen Binaries (NetCat / nc) gibt es hier http://homematic-forum.de/forum/viewtopic.php?f=26&t=13299. Diese sollte irgendwo unterhalb von /etc/config/addons abgelegt werden (genau wie das Script selbst). Am besten ein Unterverzeichnis anlegen:


mkdir /etc/config/addons/scripts


Wenn das Script nun z.B. fhemcmd.sh heißt, sollte zunächst das Ausführungsflag gesetzt werden:


cd /etc/config/addons/scripts
chmod +x nc
chmod +x fhemcmd.sh


Zum Ausführen des Scripts aus einem CCU Programm empfiehlt sich die Verwendung eines CUxD Exec Device. Dieses wird (wenn CUxD auf der CCU installiert ist) wie folgt angelegt:


  • In der CCU Weboberfläche den Menübefehl "Einstellungen / Systemsteuerung" aufrufen
  • In der folgenden Ansicht den Button "CUx Daemon" anklicken
  • Auf der CUxD Config-Seite rechts oben den Button "Geräte" anklicken
  • CUxD Gerätetyp = "28 System", Funktion = "Exec", Name und Icon nach Belieben
  • Button "Gerät auf CCU erzeugen" anklick

Das CUxD Exec-Device kann nun in einem Homematic Script wie folgt verwendet werden, um einen FHEM-Befehl auszuführen:


var fhemcmd = dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC");
fhemcmd.State('/etc/config/addons/scripts/fhemcmd.sh "set mydev mycmd value"');


Die Adresse des CUxD Devices muss entsprechend dem weiter oben angelegten Device angepasst werden.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

Sven4597

#1
Hallo,

ich habe einen Script angelegt mit dem Namen fhemcmd.shmit dem Inhalt
Zitat#!/bin/sh

FHEM_SERVER="192.168.178.40"
FHEM_PORT=7072
NCPATH="/etc/config/addons/scripts"

if [ $# -ne 1 ]; then
   echo "Usage: fhem.sh Command"
   exit 1
fi

echo -e "$1\nquit\n" | $NCPATH/nc $FHEM_SERVER $FHEM_PORT

unter /etc/config/addons/scripts sowie die nc und socat

Was ich nicht verstanden habe ist:
ZitatWenn das Script nun z.B. fhemcmd.sh heißt, sollte zunächst das Ausführungsflag gesetzt werden:
cd /etc/config/addons/scripts
chmod +x nc
chmod +x fhemcmd.sh
Wo muss das gespeichert werden?

CUxD Exec Device habe ich auch angelegt

Zitatvar fhemcmd = dom.GetObject("CUxD.CUX2801002:1.CMD_EXEC");
fhemcmd.State('/etc/config/addons/scripts/fhemcmd.sh "set Buderus2107_USB hk2_betriebsart nacht"');

Grüße Sven


Wernieman

Bei Deinem Einrichtugnsproblem kann ich Dir nicht helfen, ABER ...FHEM_PORT
Du hast in "FHEM_SERVER" einen Port definiert (8083), der dort nicht hingehört. Du hast schließlich auch die Variable "FHEM_PORT"
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Sven4597

Hallo,

ich habe einen Script angelegt mit dem Namen fhemcmd.sh mit dem Inhalt.
Zitat#!/bin/sh

FHEM_SERVER="192.168.178.40"
FHEM_PORT=7072
NCPATH="/etc/config/addons/scripts"

if [ $# -ne 1 ]; then
   echo "Usage: fhem.sh Command"
   exit 1
fi

echo -e "$1\nquit\n" | $NCPATH/nc $FHEM_SERVER $FHEM_PORT

unter /etc/config/addons/scripts den Scriot fhemcmd.sh sowie die nc und socat

unter /etc/config/addons/scripts den script fhem.sh
Zitat
cd /etc/config/addons/scripts
chmod +x nc
chmod +x fhemcmd.sh

CUxD Exec Device habe ich auch angelegt

Zitatvar fhemcmd = dom.GetObject("CUxD.CUX2801002:1.CMD_EXEC");
fhemcmd.State('/etc/config/addons/scripts/fhemcmd.sh "set Buderus2107_USB hk2_betriebsart nacht"');

in CUxD bekomme ich im Log die Meldung
ZitatJan 21 14:29:32 homematic-ccu3 daemon.info cuxd[30166]: system(/etc/config/addons/scripts/fhemcmd.sh "set Buderus2107_USB hk2_betriebsart nacht") exit(126) 0s

Der Staus ändert sich aber nicht in FHEM
Muss ich in FHEM noch was freischalten?
Passt der Port 7072 weil zum einloggen habe ich den Port 8083

Grüße Sven


Otto123

Hallo Sven,

hast Du denn Telnet Port 7072 definiert? Standard ist das ja nicht mehr bei FHEM ;)
Wenn also list telnetPort nichts ergibt machst Du bitte
define telnetPort telnet 7072 global


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sven4597

Zitat von: Otto123 am 21 Januar 2021, 14:57:41
Hallo Sven,

hast Du denn Telnet Port 7072 definiert? Standard ist das ja nicht mehr bei FHEM ;)
Wenn also list telnetPort nichts ergibt machst Du bitte
define telnetPort telnet 7072 global


Gruß Otto

Den Port habe ich eingerichtet wie du geschrieben hast.
Leider geht es immer noch nicht.

Otto123

Kannst Du von einer anderen Maschine oder dem FHEM Server selbst im Terminal mal die Funktion testen?
echo -e "set Buderus2107_USB hk2_betriebsart nacht\nquit\n" | nc 192.168.178.40 7072

nc ist normal vorhanden
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sven4597

Zitat von: Otto123 am 21 Januar 2021, 15:36:55
Kannst Du von einer anderen Maschine oder dem FHEM Server selbst im Terminal mal die Funktion testen?
echo -e "set Buderus2107_USB hk2_betriebsart nacht\nquit\n" | nc 192.168.178.40 7072

nc ist normal vorhanden

da bekomme ich ein Bye...
mymachine:~ $ echo -e "set Buderus2107_USB hk2_betriebsart nacht\nquit\n" | nc 192.168.178.40 7072
Bye...

Habe noch eine andere Möglichkeit gefunden spricht da was dagegen?
Zitatstring tmpA= "http://192.168.178.40:8083/fhem?cmd=set Buderus2107_USB hk2_betriebsart nacht";
dom.GetObject("CUxD.CUX2801002:1.CMD_EXEC").State("wget -q -O - '"#tmpA#"'");

Otto123

#8
Zitatda bekomme ich ein Bye...
Und in FHEM passiert nix? Also der Befehl set Buderus2107_USB hk2_betriebsart nacht wir nicht ausgeführt? Stimmt der denn so? In der FHEM Befehlszeile getestet?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

Funktioniet die befehlszeile überhaupt in FHEM? Also in der Weboberfläche mal "set Buderus2107_USB hk2_betriebsart nacht" eingegeben?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Sven4597

Zitat von: Wernieman am 21 Januar 2021, 17:07:38
Funktioniet die befehlszeile überhaupt in FHEM? Also in der Weboberfläche mal "set Buderus2107_USB hk2_betriebsart nacht" eingegeben?

ja das geht

Wernieman

Ich hatte Dir "gaaaans oben" etwas bezüglich der Portangaben in Deinem Script geschrieben .. gelesen?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

jack85

Ich wärme dieses Thema noch mal auf.
Habe genau nach dieser Anleitung alles eingerichtet, bekomme aber immer einen exit code(127), sobald ich das auf der ccu3 ausführen will.

ZitatMar 19 20:13:16 ccu3-webui daemon.info cuxd[2594]: system(echo -e 'set TelegramBot _msg test\nquit\n' | /etc/config/addons/scripts/nc 192.168.178.61 7072) exit(127) 0s

Führe ich den diesen echo Befehl ohne das fhemcmd.sh script direkt aufder console aus, klappt es ohne Probleme. Sobald ich es aber im cuxD Device (System 28) mittels dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC") ausführe, bekomme ich immer den code 127.

Habe auch schon versucht den echo Befehl direkt in dem cuxD Device:1 zu hinterlegen und von dort aus auszuführen. Selbe Ergebnis.

Hat hier vieleicht jemand schon Erfahrung mit diesem Fehler gehabt? Habe auchschon im Homematic Forum eine Anfrage platziert, jedoch keine Antwort erhalten.
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

jack85

Hintergrundinformation zu meinem Anwendungsfall:
Ich habe eine Alarmanlage über Homematic->CCU3(pivccu)->Fhem realisiert. Funktioniert für mich soweit ganz gut.
Jetzt möchte ich beim Auslösen eines Alarms eine Nachricht an Telegramm Kontakte versenden. Das würde ich dann in Fhem machen. Ist das der richtige Weg, dieses über das cuxD Device zu machen, oder gibt es da bessere Lösungen? Ich hätte das lieber über ein notify in Fhem selber gelöst, weiß jetzt aber nicht, wie ich Fhem mitteile, dass der Alarm in der CCU3 ausgelöst wurde.
Ich sehe aber bestimmt den Wald vor lauter Bäumen nicht
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

JoWiemann

Zitat von: jack85 am 20 März 2024, 09:50:06Ich sehe aber bestimmt den Wald vor lauter Bäumen nicht

Hallo,

ich habe mal eine Suchmaschine den Wald lichten lassen. War gar nicht so schwer.

https://digitaldad.de/2020/09/07/so-sendet-deine-ccu-dir-telegram-nachrichten-aufs-smartphone/

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Otto123

Zitat von: jack85 am 20 März 2024, 09:39:24Ich wärme dieses Thema noch mal auf.
Ich finde Du hast die letzten Beiträge mit der eigentlichen Anleitung ziemlich durcheinandergewürfelt.
Kannst Du denn mit der Anleitung im ersten Beitrag irgendeine Reaktion in FHEM auslösen? Vielleicht nicht gleich Telegramm sondern einfach ein set Lampe on ?

Ob der 9 Jahre alte Beitrag immer noch aktuell ist, weiß ich allerdings auch nicht. Ich meine mit dem HMCCU Modul (was in dieser Zeit vom TE kräftig entwickelt wurde) kannst Du dies auch komplett in FHEM abbilden.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

jack85

Hallo Jörg,
danke für deine Antwort. Da ich Telegramm sowieso in Fhem schon eingerichtet habe und auch nutze, würde ich diesen Step auch gerne dort lassen. Zumal auch noch andere Aktionen bei Alarm ausgelöst werden, wie Rollladen hochfahren, Licht an usw. Ich muss Fhem nur mitteilen, dass Alarm ausgelöst wurde. Deswegen fand ich diese Anleitung hier ganz gut, funktioniert halt nicht.
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

zap

Zitat von: jack85 am 20 März 2024, 09:39:24Ich wärme dieses Thema noch mal auf.
Habe genau nach dieser Anleitung alles eingerichtet, bekomme aber immer einen exit code(127), sobald ich das auf der ccu3 ausführen will.

ZitatMar 19 20:13:16 ccu3-webui daemon.info cuxd[2594]: system(echo -e 'set TelegramBot _msg test\nquit\n' | /etc/config/addons/scripts/nc 192.168.178.61 7072) exit(127) 0s

Führe ich den diesen echo Befehl ohne das fhemcmd.sh script direkt aufder console aus, klappt es ohne Probleme. Sobald ich es aber im cuxD Device (System 28) mittels dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC") ausführe, bekomme ich immer den code 127. 

Anscheinend doch nicht genauso umgesetzt wie im 1. Beitrag. Warum verwendest Du einfache statt doppelter Hochkommas? Das verhindert vermutlich die Interpretation von \n als Steuerzeichen.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

jack85

Zitat von: Otto123 am 20 März 2024, 10:27:45
Zitat von: jack85 am 20 März 2024, 09:39:24Ich wärme dieses Thema noch mal auf.
Ich finde Du hast die letzten Beiträge mit der eigentlichen Anleitung ziemlich durcheinandergewürfelt.
Kannst Du denn mit der Anleitung im ersten Beitrag irgendeine Reaktion in FHEM auslösen? Vielleicht nicht gleich Telegramm sondern einfach ein set Lampe on ?

Ob der 9 Jahre alte Beitrag immer noch aktuell ist, weiß ich allerdings auch nicht. Ich meine mit dem HMCCU Modul (was in dieser Zeit vom TE kräftig entwickelt wurde) kannst Du dies auch komplett in FHEM abbilden.

Hallo Otto,

ja, ich habe natürlich auch einfache Befehle, wie "set Lampe on" ausprobiert. Das gleiche Ergebnis: exit code(127)
Bei diesem Fehlercode schreiben etliche User, dass es sich um Syntaxfehler handelt, bzw. Pfade nicht erreichbar sind. Deswegen auch der Gegentest direkt im Terminal. Dort funktioniert es halt. Muss dazu sagen, dass ich mich im Terminal direkt auf dem Raspberry befinde, aufdem Fhem installiert ist. Die CCU3 läuft ja im pivccu Container, wo dann auch noch der CuxD Deamon installiert ist. Nicht dass die CUXD wegen irgendwelchen Firewall-Regeln oder Ports diese Anfragen blockiert.
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

jack85

Zitat von: zap am 20 März 2024, 11:36:14
Zitat von: jack85 am 20 März 2024, 09:39:24Ich wärme dieses Thema noch mal auf.
Habe genau nach dieser Anleitung alles eingerichtet, bekomme aber immer einen exit code(127), sobald ich das auf der ccu3 ausführen will.

ZitatMar 19 20:13:16 ccu3-webui daemon.info cuxd[2594]: system(echo -e 'set TelegramBot _msg test\nquit\n' | /etc/config/addons/scripts/nc 192.168.178.61 7072) exit(127) 0s

Führe ich den diesen echo Befehl ohne das fhemcmd.sh script direkt aufder console aus, klappt es ohne Probleme. Sobald ich es aber im cuxD Device (System 28) mittels dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC") ausführe, bekomme ich immer den code 127. 

Anscheinend doch nicht genauso umgesetzt wie im 1. Beitrag. Warum verwendest Du einfache statt doppelter Hochkommas? Das verhindert vermutlich die Interpretation von \n als Steuerzeichen.

Habe das mit einfachen und doppelten Hochkommas getestet. Leider das gleiche Ergebnis.
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

zap

#20
Also das funktioniert ganz sicher nicht:

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC")

Wenn, dann

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State('Befehl')

Und nicht vergessen: Der gesamte Befehl muß in einfachen Hochkomma eingeschlossen sein.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

jack85

Damit wir uns nicht missverstehen, ;D  Ich habe alles nach der Anleitung wie oben beschrieben eingerichtet:

Im Verzeichniss /etc/config/addons/scripts folgende Dateien hinterlegt:
ls -l
Zitat-rwxr-xr-x 1   215    Mar 19    18:31    fhemcmd.sh
-rwxr-xr-x 1    43337    May 21  2013    nc
-rwx--x--x 1   294908    May 24  2013    socat


cat fhemcmd.sh
Zitat#!/bin/sh

FHEM_SERVER="192.168.178.61"
FHEM_PORT=7072
NCPATH="/etc/config/addons/scripts"

if [ $# -ne 1 ]; then
   echo "Usage: fhem.sh Command"
   exit 1
fi

echo -e "$1\nquit\n" | $NCPATH/nc $FHEM_SERVER $FHEM_PORT

Im Skript in der CCU3 folgendes hinterlegt:
Zitatvar fhemcmd = dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC");
fhemcmd.State('/etc/config/addons/scripts/fhemcmd.sh "set TelegramBot _msg test"');
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

jack85

Ich sehe grade, ich kriege einen Error Log Eintrag im cuxD Deamon, wenn ich ich das Scrippt in der CCU3 speichere:
ZitatMar 20 20:23:30 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: system.SetSessionVar("sessionCTV", "true"); [ExecError():iseESPexec.cpp:12907]
Mar 20 20:23:41 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: system.SetSessionVar("sessionCTV", "true"); [ExecError():iseESPexec.cpp:12907]
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

zap

Habe ich noch nie gesehen. Ich stelle das nochmal bei mir nach ...
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

#24
Das funktioniert bei mir, sowohl einfache als auch komplizierte Variante:

Komplizierte Variante:

string chnName = "system_exec:1";
string dpName = "CMD_EXEC";
string fhem = "/usr/local/scripts/fhem.sh 'set HMIP_PS_000213C9909359_2 on'";
object chnObj = channels.Get(chnName);
if(chnObj) {
   var dp = chnObj.DPByHssDP(dpName);
   if(dp) {
      WriteLine("Executing command " # fhem # " on " # chnName # "." # dpName);
      dp.State(fhem);
   }
   else {
      WriteLine("Datapoint " # dpName # " not found");
   }
}
else {
   WriteLine("Channel " # chnName # " not found");
}

Einfache Variante (in etwa Deine Version):

var fhemcmd = dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC");
if(fhemcmd) {
   fhemcmd.State('/usr/local/scripts/fhem.sh "set HMIP_PS_000213C9909359_2 off"');
}
else {
   WriteLine("CMD_EXEC not found");
}

Und dieser fhem.sh:

#!/bin/sh

FHEM_SERVER="xxx"
FHEM_PORT=7072
NC_PATH="/usr/bin"

if [ $# -ne 1 ]; then
    echo "Usage: fhem.sh Command" >/tmp/fhem.log
    exit 1
fi

echo -e "$1\nquit\n" >/tmp/fhem.log

echo -e "$1\nquit\n" | $NC_PATH/nc $FHEM_SERVER $FHEM_PORT

Kannst Du nochmal prüfen, dass alle Dateien (fhemcmd.sh, nc) an den angegebenen Orten vorhanden und ausführbar sind? Die Flags bitte mal auf 755 setzen, z.B. "chmod 755 nc".
Haben auch die übergeordneten Verzeichnisse die "x" Flags gesetzt?

Returncode 127 besagt, dass ein Befehl/eine Datei nicht gefunden wurde oder nicht ausführbar ist.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

jack85

Hallo zap und an alle anderen involvierten,

riesen riesen riesen Sorry von mir an dieser Stelle. Ich hatte einen krassen Denkfehler.

Habe diese Anleitung hier wie beschrieben ausgeführt. Also alle Dateien unter den angegebenen Pfaden hinterlegt. Nur dabei gar nicht dran gedacht, das ich mich auf dem Raspberry befinde und nicht auf der CCU. Da diese in einem Container mit einer eigenen IP läuft, musste ich erstmal ssh auf der ccu aktivieren, mich dahin verbinden und dort alles nach dieser Anleitung durchführen. Dann funktioniert es halt auch auf Anhieb.

Das ist mir jetzt mega peinlich *schäm*
RaspberryPi 3 - CCU3 -  RPI-RF-MOD - Homematic - Shelly

Wernieman

Wobei das dann aber eventuell nicht persistent ist, d.h. z.B. ein docker compose down würde alles zunichtemachen ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html