doif: 1)Fehler im LOG 2)FHEM nach Ausführung Probleme zu haben 3)sleep.

Begonnen von matzke, 06 Dezember 2021, 18:13:54

Vorheriges Thema - Nächstes Thema

matzke

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

matzke

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).

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

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

matzke

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.

matzke


matzke

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)")};


  • Sinn und Zweck von "quiet" verstehe ich auch trotz commandref nicht wirklich??
  • Wo würde ich eine [<id>] einfügen?

Otto123

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
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

matzke

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?

Otto123

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
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

matzke

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.


Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

matzke

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') }}")}

Otto123

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?
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