FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: matzke am 06 Dezember 2021, 18:13:54

Titel: doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 06 Dezember 2021, 18:13:54
Hallo,
ich habe mir eine sub() erstellt, die u.a. folgends doif erstellt. Das doif soll eine Gerät ausschalten, wenn die if-Bedingung eintritt und sich dann selbst löschen. Das funktioniert so weit auch.

{ fhem("define mod_192.168.178.72_0_doif_off DOIF ([mod_192.168.178.72:power_0] < 1) (set mod_192.168.178.72 off 0;;sleep 5;;delete mod_192.168.178.72_0_doif_off)")};

Ich habe aber zwei Problem:

1. Diese Fehlermeldung im LOG. Was mach ich falsch? Ich weiß nicht, was die fhem.pl-Datei ist.
2021.12.06 12:29:04 1: devspec2array mod_192.168.178.72_0_doif_off): Unmatched ) in regex; marked by <-- HERE in m/^(mod_192.168.178.72_0_doif_off)) <-- HERE $/ at fhem.pl line 1341.

2. Nach Ausführung der doif, scheint FHEM einzuschlafen. Wenigstens teilweise. Manche Dinge funktionieren. Andere nicht. Wenn ich FHEM neu starten funktioniert alles prima. Ich glaube zu mindestens, dass diese doif der Grund dafür ist.

Grund kann aber auch sein: Was passiert, wenn FHEM z.B. den Befehl ausführen soll, aber das nachfolgende Gerät mod_192... usw. gar nicht existiert (Man soll ja sleep nicht als letzten Befehl ausführen, da einschläft) Wird beim Fehlen des Gerätes der letzte Befehl gar nicht als letzter Befehl gewertet sondern "sleep"?
{ fhem("sleep 5;delete mod_192.168.178.72_0_doif_off")};

Vielen Dank,
schönen Abend
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Damian am 06 Dezember 2021, 19:00:26
Selbstlöschende DOIF´s sind keine gute Idee. DOIF schreibt diverse Readings nachdem es einen Befehl ausgeführt hat - das kann nicht gut gehen und führt zu Seiteneffekten mit Fehlern, die nicht absehbar sind.
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 06 Dezember 2021, 20:03:21
OK, nach rumtesten, dachte ich mir das bereits.

Was würde ohne Probleme funktionieren?

Notify?

bestimmtes fhem-Ereignis -> 1xAktion und löschen des Überwachungsgerätes

(in der Art wie at 1x ausführen und weg, jedoch Ereignisabhängig und nicht zeitabhängig).
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Damian am 06 Dezember 2021, 20:06:59
Beschreib mal deine Anforderung. Das ist bestimmt mit einem Einzeiler erledigt ohne ständig Devices zu erstellen und zu löschen - das verändert nämlich deine Konfiguration, sichtbar am roten Fragezeichen.
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Otto123 am 06 Dezember 2021, 20:14:31
Zitat von: matzke am 06 Dezember 2021, 20:03:21
(in der Art wie at 1x ausführen und weg, jedoch Ereignisabhängig und nicht zeitabhängig).
Das macht FHEM sleep https://fhem.de/commandref_DE.html#sleep
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 06 Dezember 2021, 20:23:35
Ich schalte ein Aktor (Shelly2.5) ein. An dem Shelly hängt ein Ladegerät. Wenn die Stromverbrauchs-Messung des Aktor unter z.B. 1 fällt (d.h. Ladung beendet), dann soll der Aktor ausschalten. Das ist so ja ganz einfach mit einer doif zu lösen.

Mein Ziel war es aber, dass dies mit einer Subroutine auf mehrere Aktoren (Shellys, Nodons) anwenden kann.

Also:
Irgendein von mir zu definierender Aktor wird eingeschaltet -> sub übernimmt u.a. doif-Erstellung, welcher wieder rum auf Ereignis bezüglich Stromverbrauch wartet -> ausgelöst wird und dann wieder doif-Löschung.

Klar kann ich auch zu jedem Aktor und Kanal eine angepasste doif hängen. Das wollte ich um mein FHEM unnötig aufzublähen. Da blick ich dann nicht mehr durch.
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 06 Dezember 2021, 20:27:44
Zitat von: Otto123 am 06 Dezember 2021, 20:14:31
Das macht FHEM sleep https://fhem.de/commandref_DE.html#sleep

OK, das muss ich mir morgen mal nährer anschauen. Das wäre ja perfekt.
Vielen Dank.
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 08 Dezember 2021, 18:08:55
Zitat von: Otto123 am 06 Dezember 2021, 20:14:31
Das macht FHEM sleep https://fhem.de/commandref_DE.html#sleep

Hi, habe es jetzt mit "sleep" mal probiert und scheint auch fast korrekt zu laufen.

Ich bekomme aber ins immer ins Log "After sleep: Last parameter must be quiet" geschrieben und möglicherweise hängt FHEM auch immer noch (konnte ich jetzt noch nicht testen).

Was ist an meiner folgenden Zeile falsch?


Aufgabe des Code: Solle erst 3 Minuten warten und ab dann per Ping prüfen ob PC noch online ist. Wenn PC down, dann Aktor ausschalten und auch Ping disablen.

{ fhem("sleep 180;sleep {if (lanping_pc_15W_nuc7i3BNH_schlfz:.* eq 'absent')} (setreading dev_dummySchlfzWeckK1 B_SleepPingEnde Ende: $h:$m:$s;set dev_dummySchlfzWeckK1 off;attr lanping_pc_15W_nuc7i3BNH_schlfz disable 1)")};

Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Otto123 am 08 Dezember 2021, 18:31:46
Wo hast Du Dir den Syntax wieder rausgewünscht? Die Meldung mit dem quiet sagt Dir: Du hast Mist gebaut!
sleep {if (lanping_pc_15W_nuc7i3BNH_schlfz:.* eq 'absent')}
Suchmuster ist das hier, genau wie beim notify! Und KEINE Abfrage mit if  ::)
lanping_pc_15W_nuc7i3BNH_schlfz:.*

Danach kannst Du gerne Deine Abfrage konstruieren:
sleep lanping_pc_15W_nuc7i3BNH_schlfz:.*; {if {}()}
Aber ehrlich ob das jetzt die sinnvolle Anwendung ist überblick ich noch nicht.

Also wie immer: Eventmonitor auf und den Event, der das Suchmuster treffen soll, genau raussuchen.
Die ID kannst dazu nehmen, damit nicht pausenlos neue sleeps angelegt werden: sleep 80 name;  überschreibt bei jedem Aufruf das sleep name.

getestet - funktioniert bis auf Deine Zeit in den dummy schreiben
sleep 180 ; sleep lanping_pc_15W_nuc7i3BNH_schlfz:absent ; setreading dev_dummySchlfzWeckK1 B_SleepPingEnde Ende: $h:$m:$s ; set dev_dummySchlfzWeckK1 off ; set lanping_pc_15W_nuc7i3BNH_schlfz inactive
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM scheint nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 08 Dezember 2021, 19:23:40
Zitat von: Otto123 am 08 Dezember 2021, 18:31:46
Aber ehrlich ob das jetzt die sinnvolle Anwendung ist überblick ich noch nicht.

Nee, so schlääd wars doch nicht, da ich bei einem anderen Gerät ja das Problem habe: Ereignis = mod_192.168.178.72:power_0:.18.62

ich wollte aber erreichen, dass der

sleep nur aufgelöst wird, wenn sleep mod_192.168.178.72:power_0:<5

daher kommt das if. Würde das funktionieren? Oder noch mehr schlääder?
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Otto123 am 08 Dezember 2021, 19:48:36
sleep, notify triggert auf einen Event! Im Suchmuster gibt es kein größer kleiner if ...

Ich würde es so verwenden:
sleep device:absent ; mach was
notify device:temperature:.* war die Zahl kleiner 7 dann mach was
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 08 Dezember 2021, 20:06:15
Ja, dann brauche ich eine andere Lösung.

FHEM soll ja den Aktor (Ladegerät) erst ausschalten, wenn die Power unter eine Schwelle flällt. Das wäre mit einem Doif ja ganz einfach.
Aber ich wollte durch eine Sub in der Art wie ein at ein einmaliges Gerät durch eine Subroutine anlegen, dass dann wieder nach dem Schwellen-Ereignis weg ist. Damit ich nicht für 2-3 Ladegeräte, ein TV, ein PC usw. jeweils ein doif anlegen und verwalten muss.

Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Damian am 08 Dezember 2021, 20:14:20
Zitat von: matzke am 08 Dezember 2021, 20:06:15
Ja, dann brauche ich eine andere Lösung.

FHEM soll ja den Aktor (Ladegerät) erst ausschalten, wenn die Power unter eine Schwelle flällt. Das wäre mit einem Doif ja ganz einfach.
Aber ich wollte durch eine Sub in der Art wie ein at ein einmaliges Gerät durch eine Subroutine anlegen, dass dann wieder nach dem Schwellen-Ereignis weg ist. Damit ich nicht für 2-3 Ladegeräte, ein TV, ein PC usw. jeweils ein doif anlegen und verwalten muss.

Ein generalisiertes DOIF kann man mit Templates realisieren. Hier kannst du dich einlesen https://wiki.fhem.de/wiki/DOIF/Automatisierung
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 10 Dezember 2021, 20:06:03
Ich habe mir jetzt überlegt, dass ganze doch mit einem at zu machen.

Ein at, welches durch eine Sub() generiert wird, wenn man ein Aktor einschaltet und dann
alle x Minuten den Powerstatus des Aktors überprüft, und bei < 5 Watt den Aktor abschaltet und dann sich selbst löscht.

Kann man das machen? Ein at sich selbst löscht, oder führt das wie bei einem doif auch zu Problemen?

Habs leider noch nicht zum Laufen bekommen. Liegt an den Hochstrichen oder vlt. auch den Variablen? Mist, dass ich immer so Probleme mit den Klammern, Hochstichen usw. haben. Was meint Ihr? Sollte das so gehen?

{ fhem("sleep 120 ; define $atName at +*00:05:00 { if ( ReadingsVal('$Device','power_$Channel','') < $PowerSchwelle ) { fhem('set mod.192.168.178.72 off 0 ; sleep 3 ; delete $atName') }}")}
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Otto123 am 10 Dezember 2021, 20:45:58
bei entsprechender Definition löscht sich ein at sowieso selbst.

Ich finde, Du hast die völlig falschen Denkansätze FHEM ist keine Codewurm oder Wegwerfsystem...

Ich habe nicht verstanden was an "Damit ich nicht für 2-3 Ladegeräte, ein TV, ein PC usw. " diesen Schwurbel rechtfertigen soll?
Warum muss man z.B. eine Überwachungsschaltung für ein Ladegerät nach einmaligem Gebrauch wegwerfen? Weil es kein Pfandsystem gibt?
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 10 Dezember 2021, 22:42:09
Zitat von: Otto123 am 10 Dezember 2021, 20:45:58
bei entsprechender Definition löscht sich ein at sowieso selbst.

Ich finde, Du hast die völlig falschen Denkansätze FHEM ist keine Codewurm oder Wegwerfsystem...

Ich habe nicht verstanden was an "Damit ich nicht für 2-3 Ladegeräte, ein TV, ein PC usw. " diesen Schwurbel rechtfertigen soll?
Warum muss man z.B. eine Überwachungsschaltung für ein Ladegerät nach einmaligem Gebrauch wegwerfen? Weil es kein Pfandsystem gibt?

Na, ich habe halt die Vorstellung:
- Geräte (Hardware) anlegen und nur eine doif zu ordnen.
- Die doif hat jeweils den gleichen Aufbau und ruft eine Haupt-Sub() auf mit Übergabe von $Evend $Device $Self usw. (Also die doifs brauchen praktisch keine Pflege)
- Die Haupt-Sub ruft je auslösendem Gerät und Event im optimalen Fall standartisiert Untersubs auf, falls notwendig spezielle Untersubs oder führt Minitasks gleich selbst aus.

Ergebnis für mich als Laie:
- schmales, übersichtliches FHEM, aber eher umfangreiches Perl,
- keine weiteren Dinge in FHEM pflegen müssen,
- empfunden schnellers Umbauen mit Perl, da ich im Moment ständig ein Gerät wegnehme oder hinzufüge, umfunktioniere oder Funktionen anpasse.
- irgendwann muss FHEM einfach mal laufen. Und da glaube ich, wenn ich nach dann nach einem halb Jahr wieder mal was ändern muss, ist Perl übersichtlicher.

Tja, ob dem wirklich mit allem so ist oder alles "schwurbel" ist, weiß ich nicht, da ich erst kurze Zeit mit FHEM befasse. Ich dachte aber ernsthaft, dass ihr Profis das so macht. :)

Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Otto123 am 10 Dezember 2021, 23:39:48
ZitatFHEM ist ein Perl Server für die Haustechnik. Mit FHEM können verschiedene Aufgaben wie z.B. das Schalten von Lampen, die Steuerung von Jalousien oder Heizkörpern und vieles mehr im Haushalt automatisiert werden.
ZitatDOIF (ausgeprochen: du if, übersetzt: tue wenn) ist ein universelles Modul mit Web-Interface, welches ereignis- und zeitgesteuert in Abhängigkeit definierter Bedingungen Anweisungen ausführt.
Mit diesem Modul ist es möglich, einfache wie auch komplexere Automatisierungsvorgänge zu definieren oder in Perl zu programmieren.
ZitatGeräte (Hardware) anlegen und nur eine doif zu ordnen.
Meine Gedanken dazu:
FHEM ist der Automatisierungsserver
DOIF ist eine Art eigener Automatisierungsserver innerhalb FHEM
Du willst jetzt den Automatisierungsserver im Automatisierungsserver im Automatisierungsserver schreiben? Der Gedanke ist mir zu abwegig. Ich wünsche Dir Erfolg.
Aber eigentlich würde ich mir wünschen Du würdest versuchen zu verstehen wie FHEM verwendet werden kann. Wenn dann noch eine Aufgabe nicht gelöst werden kann, könntest Du Dir eine PerlSub schreiben :)
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Damian am 10 Dezember 2021, 23:57:41
Ich würde mich für eine Welt entscheiden. Entweder du arbeitest mit notify, at, sleep und Perl oder du nimmst DOIF und Perl. Beide Welten kann man natürlich mischen, aber da muss man sich auf die Dauer in beide Welten tief einarbeiten, zumal man dann mit kleinen aber feinen Unterschieden der beiden Welten immer wieder zu kämpfen haben wird.
Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: matzke am 11 Dezember 2021, 00:37:51
Zitat von: Damian am 10 Dezember 2021, 23:57:41
oder du nimmst DOIF und Perl.
Ja genau das habe ich ja gemacht. Mich für DOIF und Perl nach einigen Tagen überlegen entschieden. DOIF erschien mir mächtiger als notify, also "zukunftsicherer" mit dem ich später auf Feinheiten mal reagieren kann und Perl dazu, wie man im Forum liest "die Ordungsmacht", was ich auch jetzt schon bestätigen würde.

Das klappt im Zusammsmspiel DOIF + Perl auch soweit ganz gut. Schalten auf Ereignisse kein Problem.

Es gab dann gleich zwei, drei Herausforderungen:
1) Wie aus Perl heraus zu einem spätere Zeitpunkt eine Aktion ausführen und nicht sofort starten? Antwort: Mit Perl in FHEM ein at anlegen.
2) Wie aus Perl heraus auf ein späteres zu erwartendes Ereignis reagieren? Antwort: Mit Perl ein Sleep mit Ereignisüberwachung anlegen.
3) Wie aus Perl heraus auf ein später zu erwartendes Ereignis mit Bedingungen reagieren? Antwort: Keine Lösung.

Zu 3) will ich erstmal lösen mit einem at und if, welches dann halt alle t prüft und nach Eintritt sich selbst löscht. ist nur suboptimal, aber ok.


D.h. obwohl ich mich für DOIF und Perl klar entschieden hatte, kam ich gleich doch in die Verlegenheit auch at und Sleep dennoch nutzen müssen. Da at und Sleep sich wieder löschen, fand ich das auch ok. Fhem bleibt damit schlank und schön überschaubar.


Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Damian am 11 Dezember 2021, 10:09:35
Zitat von: matzke am 11 Dezember 2021, 00:37:51
Es gab dann gleich zwei, drei Herausforderungen:
1) Wie aus Perl heraus zu einem spätere Zeitpunkt eine Aktion ausführen und nicht sofort starten? Antwort: Mit Perl in FHEM ein at anlegen.
2) Wie aus Perl heraus auf ein späteres zu erwartendes Ereignis reagieren? Antwort: Mit Perl ein Sleep mit Ereignisüberwachung anlegen.
3) Wie aus Perl heraus auf ein später zu erwartendes Ereignis mit Bedingungen reagieren? Antwort: Keine Lösung.

Zu 1) set_Exec verwenden
Zu 2) set_Exec verwenden
Zu 3) set_Exec verwenden

Alles andere führt zum Spagetti-Code, ähnlich goto, der schwer pflegbar ist: Modul 1 ruft Modul 2 auf, Modul 2 ruft Modul 1 auf ....

Zu Generalisierung, sprich ein Modul mit einer Steuerung für mehrere Szenarien (Sensoren, Aktoren), habe ich dir bereits einen Link aufgezeigt.



Titel: Antw:doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.
Beitrag von: Per am 29 März 2022, 11:03:04
Man kann auch mit einer "sinnvollen" Namensgebung und $DEVICE arbeiten. Dann reicht ein DOIF.
Und/oder Schaltschwellen und Namen der Aktoren in Readings der zu überwachenden Devises hinterlegen. Klappt bei mir prima.