Fhem Sleep "finden" und in Perl weiter verarbeiten

Begonnen von flummy1978, 25 März 2020, 10:01:48

Vorheriges Thema - Nächstes Thema

flummy1978

Hallöchen,

ich habe für die Steckdosen an den eine Strommessung läuft ein kleines Script in myUtils geschrieben das mich benachrichtigt, wenn entsprechendes Gerät fertig ist (Spülmaschine, Waschmaschine, Trockner und Laufzeitüberwachung für andere Geräte). Die ganze Geschichte funktioniert für alle anderen Geräte perfekt, nur der Trockner ist da sehr böse ist, was den "Erkennungszeitraum" angeht. In den Abschaltminuten springt der Verbrauch ständig zwischen <140 Watt und 1 Watt hin und her, weil er ja ab und zu die Wäsche noch mal herumwirbelt.

Die anderen Geräte haben einen Wert < 4 Watt wenn sie fertig sind bleiben so und dann greift die Automatik. Beim Trockner wird die Abfrage zur Abschaltung durch den o.g. Effekt immerwieder (neu) aufgerufen und kommt daher nur mit Glück zu einem Ende. Lange Rede kurzer Sinn, ich habe das Ganze so umgesetzt (vereinfacht nur das Wichtige dargestellt):

$POW = Device mit Verbrauchsmessung

....Bedingungen werden abgefragt ob Laufzeit >Min ist mind. Verbrauch erreicht wurde etc ...
fhem ("sleep $off_delay $POW; set $POW off");

Wenn jetzt der Grenzwert nochmal überschritten wird (bei anderen stromsparenden Geräten passiert regelmäßig, dass er für n paar Sek in den Grenzwert fällt) kommt folgende Zeile zum tragen:
fhem ("cancel $POW quiet");

Gibt es nun in dem ersten Block die Möglichkeit abzufragen ob der Fhem sleep $POW vorhanden ist und läuft ? (womöglich vielleicht sogar die Laufzeit abfragen?) cancel $POW quiet löscht den Timer ja, wenn er da ist. Die Abfrage über $POW funktioniert so leider nicht ;(

Würde mich freuen, wenn mich jemand da mal in die richtige Richtung schubsen kann...

Vielen Dank im Voraus
Grüße
Andreas

Beta-User

Schau mal nach, was "cancel" an Rückmeldungen gibt, wenn es ohne Argumente aufgerufen wird ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

flummy1978

Hey,

Zitat von: Beta-User am 25 März 2020, 15:40:54
Schau mal nach, was "cancel" an Rückmeldungen gibt, wenn es ohne Argumente aufgerufen wird ;) .
Vielen herzlichen Dank für den Schubs in die richtige Richtung ... das ist schon mal was. Manchmal ist es ja wirklich einfacher als man selbst denkt:

Zitatcancel
cancel [<id> [quiet]]
Listet benannte sleeps oder entfernt ein benanntes sleep.
Mit Cancel Timer löschen, kenne und nutze ich. Dass diese auch auflisten, war mir unbekannt.

Damit würde ich ja grundsätzlich schon mal weiterkommen, aber welche (cleverere) Variante (als die untere) gäbe es denn um an diese Daten zu kommen?
Durch den Bauchnabel an den Augen operieren muss ja nicht sein, wenn ich erst in Perl die Variable Abfrage und dann nach dem Text suche?
Gibt es eine schlauere Methode das zu machen ?


my $tmp = fhem ("cancel");
my $test =0;
$test=1 if ($tmp =~ $POW);


Somit hätte die Variable Test den Wert 1 wenn der Timer gefunden wird, das könnte man weiterverarbeiten und es würde funktionieren. Aber sicherlich gibt es da auch eine elegenantere / in Perl einfachere Variante, als erst mit FHEM was aufrufen "speichern" und dann weitermachen?

Viele Grüße
Andreas

Beta-User

Na ja, wenn es ohne Abkürzung sein soll, kannst du ggf. auch den direkten Weg gehen und dir mal anschauen, was cancel ohne Argument eigentlich tut:
https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L3178

Sowas wäre dann aber nicht "änderungsfest", falls Rudi da was an der fhem.pl drehen sollte (was ich in dem Punkt nicht annehme).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

flummy1978

HA ... Vielen Dank Beta-User..... das meinte ich mit Schubsen in die richtige Richtung:

Zitat von: Beta-User am 26 März 2020, 09:16:55
Na ja, wenn es ohne Abkürzung sein soll, kannst du ggf. auch den direkten Weg gehen und dir mal anschauen, was cancel ohne Argument eigentlich tut:
https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L3178

Dort habe ich jetzt gefunden, dass die Timer in $sleepers{$id} "versteckt" sind ....

Wenn ich in myUtils die sub einbinde:
my $sleeper = CommandCancel('','');
habe ich in $sleeper alle Timer, und kann diese nach meinem Timer durchsuchen ... Diese Möglichkeit, wäre dann auch schon mal "änderungsfester", weil sich auch bei einer Änderung die Ausgabe durch Return ja bleibt. Es sei denn Rudi würde dort an der kompletten Struktur was ändern...

Sicherlich immernoch nicht die allerbeste Lösung, aber immerhin schon mal eine :)

Vielleicht hat ja jemand noch einen eleganteren Weg  8)

Vielen Dank bis hierhin

Grüße
Andreas