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.
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
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"
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
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
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.
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
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#"'");
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?
Funktioniet die befehlszeile überhaupt in FHEM? Also in der Weboberfläche mal "set Buderus2107_USB hk2_betriebsart nacht" eingegeben?
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
Ich hatte Dir "gaaaans oben" etwas bezüglich der Portangaben in Deinem Script geschrieben .. gelesen?
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.
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
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
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 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.
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.
Zitat von: Otto123 am 20 März 2024, 10:27:45Zitat 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.
Zitat von: zap am 20 März 2024, 11:36:14Zitat 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.
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.
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"');
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]
Habe ich noch nie gesehen. Ich stelle das nochmal bei mir nach ...
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.
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*
Wobei das dann aber eventuell nicht persistent ist, d.h. z.B. ein docker compose down würde alles zunichtemachen ...