Verständnisfragen zu notify -> shell script

Begonnen von mdosch, 29 November 2018, 20:35:59

Vorheriges Thema - Nächstes Thema

mdosch

Disclaimer:
FHEM-Erfahrung: nicht vorhanden
Linux-Erfahrung: moderat (Nutze privat ausschließlich Linux seit 2004, da bleibt natürlich einiges hängen aber mein Wissen ist halt nichts im Vergleich zu Leuten, die es beruflich nutzen)
Automatisierungserfahrung: moderat (SPS-Erfahrung von Ausbildung und Studim; rudimentäre µC-Programmierung im Studium)

Ich bin noch sehr neu mit FHEM und habe außer es zu installieren und ein paar basics (Nutzer/Passwort, HTTPS einrichten etc.) noch nichts damit gemacht. Derzeit möchte ich einfach die Temperatur und Luftfeuchtigkeit überwachen und per XMPP eine Nachricht senden wenn ein Raum gelüftet werden muss.

Ich habe schon einige LaCrosse-Sensoren rumliegen und warte nur noch auf meinen Jeelink um es nach dieser Anleitung [1] einzurichten. Damit ich das ganze dann möglichst schnell umsetzen kann und nicht wie der sprichwörtliche "Ochs vorm Berg" stehe lese ich mich schon etwas ein.

Ich denke folgender Schnippsel von [2] (eventuell auch mit der dort genannten Zeitabhängigkeit, nachts um 4 lüfte ich eh nicht mehr weil ich schlafe) könnte hilfreich werden:

define nt.sonnenlichtpersolar notify (sv:currentPower.*) {
if ($EVTPART1 < 3000 ) {
fhem('set Flur1 Auf');
}else {
if ($EVTPART1 > 5000 ) {
fhem('set Flur1 Ab');
}
}
}


Zu diesem Teil habe ich schon eine Frage: Wird das dann zyklisch aufgerufen und immer die Notification gesendet wenn der Wert über/unter dem Grenzwert ist? Ich möchte das natürlich nur einmal beim Überschreiten senden und dann erst wieder wenn der Grenzwert unterschritten wurde und wieder überschritten wird (am Besten noch mit einer Hysterese, falls es am Grenzwert etwas schwankt). Habt ihr da Links und/oder Literatur, die mir da etwas weiter helfen?

Dann möchte ich kein FHEM-Kommando ausführen sondern ein Shellscript aufrufen. In diversen Threads hier habe ich gelesen, dass man Systemkommandos ausführen kann wenn man diese in Backticks (`) packt. Müsste ich das dann in etwa so anpassen?

define nt.humiditySleepingRoom notify (sv:humidity.*) {   # Hier muss ich natürlich noch schauen, welche Namen ich dann nehmen muss, wenn die Sensoren eingerichtet sind.
if ($EVTPART1 > 60 ) {
fhem(`/usr/local/bin/go-sendxmpp "Schlafzimmer lüften!"`);
}
}


[1] https://www.meintechblog.de/2015/01/fhem-mit-jeelink-luftfeuchte-und-temperatur-zum-low-cost-tarif-messen/
[2] https://wiki.fhem.de/wiki/Notify

MadMax-FHEM

#1
Das mit dem ersten Notify nur einmal Nachricht etc. leider nur ein Stichwort: DOIF damit kann man sowas dann per Attribut einstellen (nutze ich aber selbst nicht, daher keine weitergehende Hilfe, sorry).

Evtl. könnte auch das Threshold-Modul helfen (nutze ich aber auch net)...

Zum Shell-Aufruf, das muss wie folgt lauten:

fhem("\"/usr/local/bin/go-sendxmpp \"Schlafzimmer lüften!\"\"")

Weil der Shellaufruf wenn du auf fhem Ebene bist muss so sein:

"Shellaufruf"

Um von Perl nach fhem (zurück) zu kommen:

fhem("fhem Befehl")

Und dann halt zusätzliche " etc. nat. "escapen"...

EDIT: "Einzelhochkomma" verhindern die Auswertung von Variablen. D.h. Variablen innerhalb "Einzelhochkommas" werden "nur" als Text "gewertet"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Hi,

Schau mal bitte im Wiki
https://wiki.fhem.de/wiki/Notify

Vielleicht hilft das zum funktionellen Verständnis und beim experimentieren.

Ein notify triggert auf einen Event,dein Beispiel hat im Ausführungsteil ein Filter.

Zu der Verwendung von Shell Kommandos siehe bitte commandref fhem Befehlstypen

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

mdosch

Zitat von: MadMax-FHEM am 29 November 2018, 20:53:16
Das mit dem ersten Notify nur einmal Nachricht etc. leider nur ein Stichwort: DOIF damit kann man sowas dann per Attribut einstellen (nutze ich aber selbst nicht, daher keine weitergehende Hilfe, sorry).

Danke, Stichworte helfen mir schon weiter. Dann kann ich gezielt in der commandref suchen. Wenn man noch nicht weiß wonach man suchen soll wird man da fast erschlagen.

Zitat von: MadMax-FHEM am 29 November 2018, 20:53:16
Zum Shell-Aufruf, das muss wie folgt lauten:

fhem("\"/usr/local/bin/go-sendxmpp \"Schlafzimmer lüften!\"\"")

[...]

Und dann halt zusätzliche " etc. nat. "escapen"...

Ok, escapen kenne ich von der Shell. Üblicherweise muss man dann Leerzeichen auch escapen, sollte es dann nicht eher so aussehen (\ nach go-sendxmpp)?

fhem("\"/usr/local/bin/go-sendxmpp\ \"Schlafzimmer lüften!\"\"")

mdosch

Zitat von: Otto123 am 29 November 2018, 20:57:28
Schau mal bitte im Wiki
https://wiki.fhem.de/wiki/Notify

Da habe ich den ersten Schnippsel ja her, aber ich werde den noch mal genauer studieren.

Zitat von: Otto123 am 29 November 2018, 20:57:28
Ein notify triggert auf einen Event,dein Beispiel hat im Ausführungsteil ein Filter.

Zu der Verwendung von Shell Kommandos siehe bitte commandref fhem Befehlstypen

Ok, danke für den Hinweis. Ich muss mich da noch weiter einlesen, damit ich dem auch komplett folgen kann. Wahrscheinlich lerne ich doch am einfachsten am lebenden Objekt wenn es dann da ist. Theoretische Überlegungen bevor die Hardware da ist werfen wohl eher Fragezeichen auf statt zu erleuchten.  ;D

MadMax-FHEM

#5
Zitat von: mdosch am 29 November 2018, 21:01:09
Danke, Stichworte helfen mir schon weiter. Dann kann ich gezielt in der commandref suchen. Wenn man noch nicht weiß wonach man suchen soll wird man da fast erschlagen.

Ok, escapen kenne ich von der Shell. Üblicherweise muss man dann Leerzeichen auch escapen, sollte es dann nicht eher so aussehen (\ nach go-sendxmpp)?

fhem("\"/usr/local/bin/go-sendxmpp\ \"Schlafzimmer lüften!\"\"")

Nö, Leerzeichen wär mir neu...

@ ist noch so ein Kandidat... ;)

Und die " (ja auch nur) weil ja innerhalb von fhem("  ") ein String kommt und der wär ja beim ersten nicht escapten " zu Ende... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Meine Empfehlung für shell:
Schreibe alles in ein Script und rufe das Script auf. da ersparst Du dir viel Hick Hack mit Anführungszeichen,escapen usw. ;D
Wenn Du willst, schau mal auf meiner Webseite. Ich habe da einen Artikel genau zu dem Thema.

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

mdosch

So, der JeeLink ist angekommen und ich habe es erst mal nach diesen Anleitungen [1][2][3] eingerichtet.

Auf eine Hysterese habe ich erst mal verzichtet und setze die Benachrichtigungen so ab: define SchlafzimmerLufteuchtigkeitAlert notify SchlafzimmerLufteuchtigkeitDummy:humid { fhem("\"/usr/local/bin/fhem-notify \"Schlafzimmer lüften!\"\"") }


Ich bin mir nicht sicher, ob da nicht noch ein "&" hinter den Befehl sollte, damit das Script nicht FHEM blockt, da es wartet falls gerade kein Internet verfügbar ist (das ist nachts ausgeschaltet und da möchte ich eh nicht lüften). Wäre nett wenn jemand weiß ob das nötig ist.

Das script sieht so aus:

#! /bin/bash

CONNECTIVITY=false

if nc -zw1 mdosch.de 443
then
        CONNECTIVITY=true
fi

while  [ $CONNECTIVITY == false ]
do
        sleep 60
        if nc -zw1 mdosch.de 443
        then
                CONNECTIVITY=true
        fi
done

echo "$@" | /usr/local/bin/go-sendxmpp user1@example.com user2@example.com


Go-sendxmpp [4] habe ich mir mal zusammengehackt als sendxmpp nicht mehr mit modernem TLS konnte.

[1] https://www.meintechblog.de/2015/01/fhem-mit-jeelink-luftfeuchte-und-temperatur-zum-low-cost-tarif-messen/
[2] https://www.my-it-brain.de/wordpress/lacrosse-sensoren-in-fhem-einbinden/
[3] https://www.computerhilfen.de/info/fhem-temperatur-warnung-mit-push-benachrichtigung-auf-dem-handy.html
[4] https://salsa.debian.org/mdosch-guest/go-sendxmpp

Otto123

Hi,

ZitatEs gibt drei Arten von Befehlen: "fhem" Befehle (werden in diesem Dokument beschrieben), SHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden) und PERL-Ausdrücken (von geschwungenen Klammern {} eingeschlossen). SHELL-Befehle oder PERL-Ausdrücke werden für komplexe at oder notify Ausdrücke benötigt, können aber auch als "normale" Befehle angewendet werden.

Die folgenden drei Befehle bewirken z.B. dasselbe Ergebnis, wenn sie am telnet-Prompt eingegeben werden:
set lamp off
"fhem.pl 7072 "set lamp off""
{fhem("set lamp off")}
SHELL-Kommandos werden im Hintergrund ausgeführt, PERL-Ausdrücke und FHEM-Kommandos werden im Haupt-"thread" ausgeführt.
Wenn ich richtig liege, machst Du mit dem Konstrukt ein Shell Komanndo in der Art "ShellBefehl"

Also brauchst Du kein & .

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

mdosch

@Otto123

ZitatSHELL-Kommandos werden im Hintergrund ausgeführt

Super, genau das wollte ich wissen. :)

Otto123

Allerdings ist das hier { fhem("\"/usr/local/bin/fhem-notify \"Schlafzimmer lüften!\"\"") }in der Art: raus rein raus.
Es sollte eigentlich auch so gehen
"/usr/local/bin/fhem-notify \"Schlafzimmer lüften!\""Es sei denn Du willst vorher irgendwas in Perl machen.

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

mdosch

#11
Danke für den Hinweis, dann vereinfache ich das mal.  :D

Edit: Es geht sogar noch einfacher: "/usr/local/bin/fhem-notify Schlafzimmer lüften!"
Sonst hat man die Anführungszeichen in der XMPP-Nachricht.