FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: flummy1978 am 14 November 2019, 20:34:59

Titel: [Gelöst](Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: flummy1978 am 14 November 2019, 20:34:59
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
Titel: Antw:(Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: flummy1978 am 16 November 2019, 23:38:35
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  ;)
Titel: Antw:(Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: amenomade am 16 November 2019, 23:57:59
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});
  }
??
Titel: Antw:(Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: flummy1978 am 17 November 2019, 01:49:35
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
Titel: Antw:(Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: amenomade am 17 November 2019, 01:55:12
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
Titel: Antw:(Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: flummy1978 am 17 November 2019, 02:04:56
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
Titel: Antw:[Gelöst](Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: amenomade am 17 November 2019, 02:06:55
Anmerkung: deine Funktion ignoriert auch off-for-timer
Titel: Antw:[Gelöst](Perl) Befehl / Erkennung bei on-for-timer (on till etc) Funktion
Beitrag von: flummy1978 am 17 November 2019, 02:08:47
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 ....