[Gelöst](Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion

Begonnen von flummy1978, 14 November 2019, 20:34:59

Vorheriges Thema - Nächstes Thema

flummy1978

Hallöchen zusammen,

ich weiss nicht ob es wirklich als Anfängerfrage tituliert werden sollte, aber mir fiel einfach kein anderer Oberbegriff dafür ein... Falls ich also vollkommen falsch bin, bitte verschieben :)

Ich habe mir eine Funktion (unten angehangen) gebastelt, die auf alle meine Geräte hört die per on/off geschaltet werden und die ein Attribut namens TIMER_Annonce oder TIMER_set haben. Sollte dieser Wert gesetzt sein, wird nach dem "on" automatisch ein sleep timer gebastelt der das Gerät nach der eingestellten Zeit (TIMER_set) ausschaltet oder mir nach der angegebenen Zeit eine Nachricht auf der eingestellten Oberfläche hinterlässt (TIMER_Annonce). Damit ich das nicht für jedes Gerät separat setzen muss, ist es allgemein gehalten und funktioniert super. Ob Licht, bestimmte Steckdosen oder was auch immer...... Es gibt allerdings ein kleines Problem:

Ich würde gerne erkennen (können) ob ein Gerät per "on-for-timer" oder "on-till" "off-till" etc gesetzt wurde, dann würde ich nämlich gern diese Funktion skippen wollen.

Für on-for-timer breche ich bereits mit der Zeile:

return undef if ($defs{$dev}->{TIMED_OnOff}->{CMD});

ab, aber ich bin mir sicher auch der Rest geht etwas einfacher oder ?

# Tante Edith ergänzt noch: Wenn man den Sleep Timer (und / oder auch) den on-for-timer auslesen könnte und darstellen könnte, wie lange dieser noch läuft wäre das natürlich auch sehr genial ;) Da wäre ich auch für Hinweise dankbar.

Ich würde mich wirklich sehr freuen, wenn mir jemand helfen mag / könnte.....


sub auto_onfortimer ($$){

my ($dev,$EVTPART0) = @_; # device and LOGreading to be used

return undef if ($defs{$dev}->{TIMED_OnOff}->{CMD});


my $settimer=AttrVal($dev,'TIMER_set',0);
my $announcetimer=AttrVal($dev,'TIMER_announce',0);
my $mainbutton = " ( ⬆️ ... LISTE ...  ⬆️) ";

return return undef if (($settimer == 0) && ($announcetimer == 0));

# Alte Timer löschen
fhem ("cancel $dev"."_set quiet");
fhem ("cancel $dev"."_announce quiet");

if (($EVTPART0 eq "on") && ($announcetimer != 0))
{

# Zeitumrechnung auf Minuten und Stunden (für Benachrichtigung)
my $tmp=();
$tmp =($announcetimer/3600)." Stunden" if ($announcetimer>3600);
$tmp =sprintf("%.2f", ($announcetimer/60))." Minuten" if ($announcetimer<3600);

# Nachrichtemempfänger vorbereiten
my $destination ="@".ReadingsVal("RESIDENT_ALL", "residentsTotalRoommatesPresentNames", 'null');
$destination =~ s/,\s/ @/gi; # @Zeichen voranstellen bei mehr als einem anwesenden
Log(1, " --- $destination ---");

# Ausschaltbutton in die Nachricht mit anängen
$mainbutton .= '( ❌ '.AttrVal($dev,'alias','0').' AUSSCHALTEN  ❌:'.$dev.') ';

fhem ("sleep $announcetimer $dev"."_announce; set dev_SYS_MSG_Bot queryInline $destination $mainbutton ".AttrVal($dev,'TIMER_announcemsg',$dev) );
}

if (($EVTPART0 eq "on") && ($settimer != 0))
{
fhem ("sleep $settimer $dev"."_set; set $dev off");
}
}


Viele Grüße und danke bereits im Vorraus

Andreas

flummy1978

Mhhmmm wenn das Ding nach 3 Tagen auf Seite 2 landet ... isses wohl doch nicht so einfach wie gedacht oder ?  :o :-\

Hab die Hoffnung noch nicht aufgegeben  ;)

amenomade

#2
In SetExtentions.pm macht die Funktion SetExtensionsCancel folgendes:
  if($hash->{TIMED_OnOff}) {      # on-for-timer, blink
    my $cmd = $hash->{TIMED_OnOff}{CMD};
    RemoveInternalTimer($hash->{TIMED_OnOff});
    delete $hash->{TIMED_OnOff};
  }

  for my $sfx ("_till", "_intervalFrom", "_intervalNext") {
    CommandDelete(undef, $name.$sfx) if($defs{$name.$sfx});
  }


Also ...
  for my $sfx ("_till", "_intervalFrom", "_intervalNext") {
    return undef if($defs{$dev.$sfx});
  }
??
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flummy1978

Hallo amenomade,

vielen lieben Dank für Deine Antwort. Nur für mich zum Verständnis, damit ich weiß was ich da tue .... mit

for my $sfx ("_till", "_intervalFrom", "_intervalNext") {
    return undef if($defs{$dev.$sfx});
  }


durchsuche ich also die ganzen Timmer alle und wenn diese dann einen treffer finden, wird abgebrochen  ?

Grüße & danke nochmal
Andreas

amenomade

#4
Damit suchst Du für ein gegebenes Device "name", ob ein temporäres name_till oder name_intervalFrom oder name_intervalNext existiert. Dann wird es in deiner Funktion ignoriert.

Damit ignorierst Du on-till, off-till, und intervals
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flummy1978

Perfekt ... ich danke Dir ...

Zusammen mit meiner Funktion von oben werden die "on-for-timer" ignoriert und somit kann ich meine Funktion nutzen und trotzdem die on-for und till funktionen Nutzen ... DANKE Dir :)

grüße
andreas

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flummy1978

Zitat von: amenomade am 17 November 2019, 02:06:55
Anmerkung: deine Funktion ignoriert auch off-for-timer

Gute Ergäzung .... stimmt. Diese wird ja auch in

return undef if ($defs{$dev}->{TIMED_OnOff}->{CMD});

ausgeschlossen (ob on-for-timer oder of-for-timer) ist ja dann hierbei egal ....