Hallo,
meine Poolsolarpumpe möchte ich alle 5 min für eine min in dem zeitintervall von 10:00 - 19:00 Uhr laufen lassen. Das Device heißt momentan noch "Silber3"
Folgendes At hat gar nicht geschaltet:
define poolsolarpumpe at *00:06 { fhem("set Silber3 on-for-timer 60") if($hour>=10 && $hour<19:00) }
--> Da habe ich nur das Uhricon beim Device gesehen. Geschaltet wurde nichts.
Dann wollte ich es mit einem Skriptaufruf probieren:
define poolsolarpumpe at +*00:05 { system("/opt/fhem/FhemUtils/timer_poolsolar.sh") if($hour>=10 && $hour<19) }
Hier das kurze Skript dazu:
#!/bin/sh
#Poolsolarpumpe steuern
# Poolsolarpumpe anschalten
echo 0
/opt/fhem/fhem.pl 7072 "set Silber3 on "
echo 1
sleep 60
/opt/fhem/fhem.pl 7072 "set Silber3 off "
echo 2
Das liegt unter opt/fhe/Fhemutils mit den nötigen Ausführungsrechten.
Per Kommandozeile wird das Skript korrekt ausgeführt. Beim Ausführen des at in fhem läßt meine Instanz nicht mehr im Browser aufrufen. Dann funktioniert das Skript auch nicht mehr per Kommandozeile.
Rufe ich das Skript im at falsch auf?
Verzweifelte Grüße
Thomas
Hallo Thomas,
Dein Script blockiert FHEM für eine Minute, siehe auch die Ausführungen hier (https://forum.fhem.de/index.php/topic,88398.msg808685.html#msg808685).
Und Dein erster Versuch if($hour>=10 && $hour<19:00)
ist falsch.
Versuch mal if($hour >= 10 && $hour < 19)
Funktioniert denn set Silber3 on-for-timer 60
???
Kann das Gerät on-for-timer ?
Gruß Otto
Hi Otto,
das mit der Formatierung hätte ich mir ja denken können. :-)
Mein Silber3 Device ist vom Typ Dummy. Per Notify (on,off) sende ich Impulse per GPIO an den 433 MHz-Sender, da mein Signalduino die Befehle, die von der Fernbedienung kommen in FHEM nicht als funktionierende IT-Device anlegen kann. Geht on-for-timer nicht bei dummy devices?
2018.06.07 08:20:09 3 : SIGNALduino433 IT: Code 01 not supported by IT_0000000000.
2018.06.07 08:20:09 3 : SIGNALduino433 IT: Code 01 not supported by IT_0000000000.
2018-06-07 08:20:09 SIGNALduino SIGNALduino433 UNKNOWNCODE i000003
2018.06.07 08:20:09 3 : SIGNALduino433: Unknown code i000003, help me!
Aus
2018.06.07 08:20:32 3 : SIGNALduino433 IT: Code DD not supported by IT_0000000000.
2018.06.07 08:20:32 3 : SIGNALduino433 IT: Code DD not supported by IT_0000000000.
2018-06-07 08:20:32 SIGNALduino SIGNALduino433 UNKNOWNCODE i00000A
2018.06.07 08:20:32 3 : SIGNALduino433: Unknown code i00000A, help me!
Und ich dachte, wenn ich nicht das "fhemeigene" sleep innerhalb von sub, do ifs ats etc. sondern es via Shell-Script aufrufe keine "Blockierung geben würde. Den verlinkten Post werde ich versuchen zu verstehen.
Grüße & Danke
Thomas
Moin Thomas,
Versuch macht kluch, was bekommst Du denn für eine Reaktion bei on-for-timer beim Dummy? ;)
Das Zauberwort ist useSetExtensions als Attribute (https://commandref.fhem.de/#dummy)!
sleep ist nicht gleich sleep!
sleep im Perl hält die Bearbeitung des Scriptes einfach an, aus FHEM im Perl Block aufgerufen hält es FHEM an.
sleep im FHEM wirkt nicht blockierend wenn danach noch ein weitere FHEM Befehl kommt.
sleep im Shellscript hält die Bearbeitung des Scriptes einfach an, je nach dem wie man das Script aus FHEM aufruft wirkt es blockierend oder nicht.
siehe z.B. hier -> https://commandref.fhem.de/commandref_DE.html#command
ZitatSHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden)
...
SHELL-Kommandos werden im Hintergrund ausgeführt,
Auch die Shell wartet normalerweise auf die Ausführung des Scriptes, ein sleep im Script hält die Shell für diesen Zeitraum an.
Man kann aber einen Scriptaufruf auch nicht wartend ausführen -> mit einem & am Ende des Aufrufes.
Aus FHEM heraus rufst Du eine Shell auf - das Konstrukt und die Reaktion wird also immer komplexer :)
Du rufst aber in deinem zweiten Versuch aus FHEM erst Perl auf {system()} und dann ein Shellscript. Das ist umständlich und noch komplexer und hat nichts mit meinem Zitat der Commandref zu tun!
Lange Rede:
attr Silber3 useSetExtensions 1
define poolsolarpumpe at *00:06 { fhem("set Silber3 on-for-timer 60") if($hour >= 10 && $hour < 19) }
sollte funktionieren.
Gruß Otto
Hi Otto,
besten Dank. Das mit dem useSetExtensions hat geklappt.
Wie müsste ich das Script denn direkt in fhem aufrufen?
defmod test_at at +*00:01 { "opt/fhem/FhemUtils/timer_poolsolar.sh" if($hour >= 10 && $hour < 22) }
Ergibt keine korrekte Ausführung, Aufruf anscheinend ja:
2018.06.07 13:15:23 3 : test_at: /opt/fhem/FhemUtils/timer_poolsolar.sh
2018-06-07 13:15:23 at test_at Next: 13:16:23
Mit doppelten "" bekomme ich folgenden Hinweis:
syntax error at (eval 80400) line 1, near """opt"
Unknown regexp modifier "/t" at (eval 80400) line 1, at end of line
Unknown regexp modifier "/e" at (eval 80400) line 1, at end of line
Unknown regexp modifier "/r" at (eval 80400) line 1, at end of line
Unknown regexp modifier "/_" at (eval 80400) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 80400) line 1, at end of line
Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 80400) line 1, at end of line
Unknown regexp modifier "/r" at (eval 80400) line 1, at end of line
Du musst immer die Ebenen unterscheiden:
FHEM
Perl
Also entweder raus / rein FHEM -> Perl -> FHEM -> Shell
Edit: funktioniert nicht siehe #7
defmod test_at at +*00:01 { fhem ("/opt/fhem/FhemUtils/timer_poolsolar.sh") if($hour >= 10 && $hour < 22) }
oder mit FHEM IF (nicht Perl if !) - ich bekomme auf die Schnelle deinen Test mit den Stunden da nicht rein :-[
defmod test_at at +*00:01 IF (Bedingung) ("/opt/fhem/FhemUtils/timer_poolsolar.sh")
oder den Test ins Script verlegen
defmod test_at at +*00:01 "/opt/fhem/FhemUtils/timer_poolsolar.sh"
Achtung: Das Script muss eXecutable sein! Ansonsten einfach den Aufruf mit "bash script.sh" ;)
Gruß Otto
vielen lieben Dank für deinen Antworten.
Werde mit das Thema noch einmal anschauen, wenn es nicht so heiß ist. :-)
Bei deiner ersten Variante bekomme ich jetzt nämlich:
2018.06.07 13:41:09 3 : opt/fhem/FhemUtils/timer_poolsolar.sh : Unknown command opt/fhem/FhemUtils/timer_poolsolar.sh, try help.
2018.06.07 13:41:09 3 : test_at: Unknown command opt/fhem/FhemUtils/timer_poolsolar.sh, try help.
Grüße
Thomas
Versuch mal die erste Variante von
defmod test_at at +*00:01 { fhem ("opt/fhem/FhemUtils/timer_poolsolar.sh") if($hour >= 10 && $hour < 22) }
Nach so zu ändern
defmod test_at at +*00:01 { fhem ('"opt/fhem/FhemUtils/timer_poolsolar.sh"') if($hour >= 10 && $hour < 22) }
Ja Cooltux hat Recht, weil je der Aufruf {fhem("")} der Syntax für den FHEM Befehl aus Perl ist und der Shell Aufruf dann noch mal in "Befehl" stehen muss. Doppelte doppelte Gänsefüße nimmt er dort aber nicht, mit den einfachen außen geht es. Da werden dann aber sicher wieder keine Variablen mehr aufgelöst.
Aus meiner Sicht ist es dann fast besser {system()} zu verwenden. Das & am Ende verhindert das Blockieren von FHEM:
defmod test_at at +*00:01 {system ("/opt/fhem/FhemUtils/timer_poolsolar.sh &") if($hour >= 10 && $hour < 22) }
Man das ist ganz schön verzwickt...
Aber nochmal der Hinweis: Bevor der Aufruf zu kompliziert wird: Einfach den Aufruf "Script" verwenden und alles im Script machen. Egal ob das Script bash, Perl, python oder sonstwas ist!
Wobei ich da jetzt gerade keine Variablenübergabe im aktuellen Beispiel sehen kann.
Zitat von: CoolTux am 07 Juni 2018, 14:49:43
Wobei ich da jetzt gerade keine Variablenübergabe im aktuellen Beispiel sehen kann.
Noch nicht ;D ;D ;D
das war nur gleich in meinem Kopf ;)
das hier
defmod test_at at +*00:01 { fhem ('"opt/fhem/FhemUtils/timer_poolsolar.sh"') if($hour >= 10 && $hour < 22) }
ergab neben dem Log keine Auswirkung.
Log:
2018-06-07 15:14:08 at test_at Next: 15:15:08
diese Variante:
defmod test_at at +*00:01 {system ("opt/fhem/FhemUtils/timer_poolsolar.sh &") if($hour >= 10 && $hour < 22) }
ergab dieses im Log:
2018.06.07 15:05:08 3 : test_at: -1
2018-06-07 15:05:08 at test_at Next: 15:06:08
Geschaltet wurde nichts.
Zitat von: tklein am 07 Juni 2018, 15:14:58
das hier
defmod test_at at +*00:01 { fhem ('"opt/fhem/FhemUtils/timer_poolsolar.sh"') if($hour >= 10 && $hour < 22) }
ergab neben dem Log keine Auswirkung.
Log:
2018-06-07 15:14:08 at test_at Next: 15:15:08
diese Variante:
defmod test_at at +*00:01 {system ("opt/fhem/FhemUtils/timer_poolsolar.sh &") if($hour >= 10 && $hour < 22) }
ergab dieses im Log:
2018.06.07 15:05:08 3 : test_at: -1
2018-06-07 15:05:08 at test_at Next: 15:06:08
Geschaltet wurde nichts.
Das musst Du bitte versuchen etwas mit zu machen und mal drüber nach zu denken was Du da genau machst. Ich arbeite hier mit Handy und mache das netter Weise zwischendurch.
Das
defmod test_at at +*00:01 { fhem ('"opt/fhem/FhemUtils/timer_poolsolar.sh"') if($hour >= 10 && $hour < 22) }
änderst Du zu
defmod test_at at +*00:01 { fhem ('"/opt/fhem/FhemUtils/timer_poolsolar.sh"') if($hour >= 10 && $hour < 22) }
das
Dann müssen wir schrittweise tiefer anfangen, Du hast ja gesagt das Script auf Terminalebene funktioniert.
Funktioniert denn der Aufruf in der FHEM Kommandozeile?
"/opt/fhem/FhemUtils/timer_poolsolar.sh &"
Gruß Otto
Otto das kann so nicht gehen. Da fehlt ein / vor dem opt
verdammt, der / ist in #4 verloren gegangen und wegen der Hitze flimmert es vor den Augen! ::)
Mein reden. Habe den Gauner auch nicht gesehen. ;D
Hallo zusammen,
jetzt klappt es auch mit dem Script.
Das wird noch auf meinem Grabstein stehen:
+*00:01 { fhem('"/opt/fhem/FhemUtils/timer_poolsolar.sh &"') if ($hour >= 10 && $hour < 22 )}
:-)
Jetzt muss ich nch sehen, wie ich verläßlich herausbekomme, ob die Sonne hier scheint, damit die Punpe nur angeht, wenn es warm ist. Evtl. mache ich das auch mit einem Delta aus Temp Vorlauf und Rücklauf. Mal sehen, welchen Sonoff ich dafür nehmen könnte. Oder ob es doch ein EasyESP Wemos D1 mini wird.
Grüße
Thomas
passt denn deine jetzige lösung überhaupt noch zur eingangsbedingung??
Zitatmeine Poolsolarpumpe möchte ich alle 5 min für eine min in dem zeitintervall von 10:00 - 19:00 Uhr laufen lassen. Das Device heißt momentan noch "Silber3"
dein at ruft momentan jede minute dein skript auf.
sieht das noch so aus wie vorher von dir gepostet??
Hi Nils,
zum Testen habe ich das Intervall auf 1 min gesetzt. Die Scriptdatei habe ich so gelassen wie anfangs gepostet.
Allerdings verwende ich jetzt die on-for time-Variante.
Grüße
Thomas