Hallo zusammen,
ich habe mir für das Modul 37_echodevices ein notify gebaut. Dieses soll bei Änderung(en) an den Weckern anhand vom Reading alarm_count erkennen, wie viele Wecker es gibt. Danach soll es diese in online und offline aufteilen und den spätesten Wecker erkennen. Leider bekomme ich es aber nicht hin.
Erstmal der Code:
define letzter_wecker notify (ECHO_123456:alarm_.._status:.(on|off)) {
my $k = "0";
my $alarmoff = "0";
foreach $k (1..ReadingsVal("$NAME", "alarm_count", "0"))
{
my $schleifennr = "1";
$schleifennr = sprintf("%02d", $k);
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");
$wecker =~ s/:00.000$//;
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && [$wecker] > [ReadingsVal("$NAME", "LastAlarm", "0")] || ReadingsVal("$NAME", "LastAlarm", "0") eq "disable")
{
fhem("setreading $NAME LastAlarm $wecker")
}
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;
if (sprintf("%02d", $alarmoff) eq $schleifennr)
{
fhem("setreading $NAME LastAlarm disabled")
}
}
}
}
Wenn ich mir per LOG 1 eine Ausgabe von alarm_count anzeigen lasse, kommt da immer wieder irgendeine Zahl heraus.
Der Count ist nun z.B. ablesbar im Gerät auf 16. Aber im LOG wird mir z.B. 15 ausgegeben. Oder auch mal 4 oder sonst was.
Anbei mal ein List:
Internals:
CHANGED
DEF AB72C64C86AW2 90F00818720600GX
FUUID 123456
IODev EchoDevices
NAME ECHO_123456
NR 353
NTFY_ORDER 50-ECHO_123456
STATE connected
TYPE echodevice
model Echo
OLDREADINGS:
READINGS:
2019-02-15 12:53:31 BrowserLanguage de,en-US;q=0.7,en;q=0.3
2019-02-15 12:53:31 BrowserUserAgent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
2019-02-15 12:49:15 LastAlarm disabled
2019-02-15 12:53:27 alarm_01_id 15cb210a-944d-3ee1-902f-fd8a4b924dd0
2019-02-15 12:53:27 alarm_01_originalTime 06:10:00.000
2019-02-15 12:53:27 alarm_01_status off
2019-02-15 12:53:27 alarm_02_id 268b9dd9-3142-3a6e-922e-2ec8711fb8c2
2019-02-15 12:53:27 alarm_02_originalTime 06:50:00.000
2019-02-15 12:53:27 alarm_02_status off
2019-02-15 12:53:27 alarm_03_id 4c150deb-eb78-3dc3-a2f2-c948f82b5175
2019-02-15 12:53:27 alarm_03_originalTime 05:03:00.000
2019-02-15 12:53:27 alarm_03_status off
2019-02-15 12:53:27 alarm_04_id 68f38d2a-a312-3e37-89e0-f69238c5d5f6
2019-02-15 12:53:27 alarm_04_originalTime 07:15:00.000
2019-02-15 12:53:27 alarm_04_status off
2019-02-15 12:53:27 alarm_05_id 74856ef8-7ff9-30d7-96be-815ed5c6ace7
2019-02-15 12:53:27 alarm_05_originalTime 11:00:00.000
2019-02-15 12:53:27 alarm_05_status off
2019-02-15 12:53:28 alarm_06_id 86dba806-5f06-386b-9d64-57a9464f1ca8
2019-02-15 12:53:28 alarm_06_originalTime 07:00:00.000
2019-02-15 12:53:28 alarm_06_status off
2019-02-15 12:53:28 alarm_07_id 99088fd3-2ad0-3a71-a500-a48a98653164
2019-02-15 12:53:28 alarm_07_originalTime 07:10:00.000
2019-02-15 12:53:28 alarm_07_status off
2019-02-15 12:53:28 alarm_08_id 99e2b934-76e0-3ca2-a011-7b24dcb7aef9
2019-02-15 12:53:28 alarm_08_originalTime 06:12:00.000
2019-02-15 12:53:28 alarm_08_status off
2019-02-15 12:53:28 alarm_09_id b4a14eaf-288a-3593-b241-bc9bb4aa5d3c
2019-02-15 12:53:28 alarm_09_originalTime 18:05:00.000
2019-02-15 12:53:28 alarm_09_status off
2019-02-15 12:53:28 alarm_10_id cad69ca8-2367-3e66-af19-2ddaf1d30584
2019-02-15 12:53:28 alarm_10_originalTime 10:00:00.000
2019-02-15 12:53:28 alarm_10_status off
2019-02-15 12:53:28 alarm_11_id d0e9a972-0040-32a1-9415-90c81b7fe22d
2019-02-15 12:53:28 alarm_11_originalTime 07:30:00.000
2019-02-15 12:53:28 alarm_11_status off
2019-02-15 12:53:28 alarm_12_id d9c5f3fc-c60b-3c15-a002-96893b18454d
2019-02-15 12:53:28 alarm_12_originalTime 05:45:00.000
2019-02-15 12:53:28 alarm_12_status off
2019-02-15 12:53:28 alarm_13_id e569bd7f-0fb0-4868-8910-622fe1d33f06
2019-02-15 12:53:28 alarm_13_originalTime 07:40:00.000
2019-02-15 12:53:28 alarm_13_status off
2019-02-15 12:53:28 alarm_14_id e88e3746-1acc-31b2-91a1-b223470059dd
2019-02-15 12:53:28 alarm_14_originalTime 09:00:00.000
2019-02-15 12:53:28 alarm_14_status off
2019-02-15 12:53:28 alarm_15_id eae2034a-9238-3635-a195-175be3eb070e
2019-02-15 12:53:28 alarm_15_originalTime 05:39:00.000
2019-02-15 12:53:28 alarm_15_status off
2019-02-15 12:53:28 alarm_16_id fdd60fd8-ebdc-3231-ad64-c5e16d11d28c
2019-02-15 12:53:28 alarm_16_originalTime 10:00:00.000
2019-02-15 12:53:28 alarm_16_status off
2019-02-15 12:53:28 alarm_count 16
2019-02-15 12:53:40 bluetooth_- disconnected
2019-02-15 12:53:40 bluetooth_- disconnected
2019-02-15 12:53:27 channel -
2019-02-15 12:53:27 currentAlbum -
2019-02-15 12:53:27 currentArtist -
2019-02-15 12:53:27 currentArtwork -
2019-02-15 12:53:27 currentTitle -
2019-02-15 12:53:27 currentTuneInID -
2019-02-15 12:53:36 deviceAddress -------------------------------------------
2019-02-15 12:53:39 dnd off
2019-02-15 12:53:36 microphone false
2019-02-14 20:27:33 model Echo
2019-02-15 12:53:28 musicalarm_count 0
2019-02-15 12:53:31 mute off
2019-02-15 12:53:33 online true
2019-02-15 12:53:27 playStatus stopped
2019-02-14 20:27:33 presence present
2019-02-15 12:53:31 progress 0
2019-02-15 12:53:31 progresslen 0
2019-02-15 12:53:28 reminder_count 0
2019-02-15 12:53:31 repeat off
2019-02-15 12:53:31 shuffle off
2019-02-15 12:53:31 state connected
2019-02-15 12:53:36 timeZoneId Europe/Berlin
2019-02-15 12:53:28 timer_count 0
2019-02-15 12:53:28 timer_id -
2019-02-15 12:53:28 timer_remainingtime 0
2019-02-14 20:27:33 version 628568420
2019-02-15 07:12:11 voice alexa alle rollos hoch
2019-02-15 07:12:11 voice_timestamp 1550211105732
2019-02-15 12:53:31 volume 27
2019-02-15 12:53:42 volume_alarm 47
2019-02-15 12:53:37 wakeword ALEXA
helper:
DEVICETYPE AB72C64C86AW2
FAMILY ECHO
NAME Kais Alexa
RUNNING_REQUEST 0
VERSION 628568420
bluetooth -
CMD_QUEUE:
Attributes:
IODev EchoDevices
alias Kais Alexa
event-on-change-reading alarm_.._status
icon echo
room Amazon
Vermutlich ergeben sich noch ein paar andere Fehler in dem Code. Das ist aber mein erstes komplett eigenes Konstrukt. Ich hatte in dem Modul Thread schon mal angefragt aber leider weiß da aktuell auch keiner weiter.
Danke schon mal!
Falscher Forenbereich!
ZitatIn diesem Board bitte keine Themen mit Fragen starten, sondern ausschließlich funktionsfähige Codeschnipsel posten.
Verschieben, vorher sag ich nichts...!
Thx für's verschieben, besser in den Anfängerfragen als sonstwo...
Erst mal ein paar Anmerkungen:
Bau sowas nicht auf einmal auf, sondern in Etappen. Und wenn du nicht sicher bist, was in den Variablen steht, schreib halt erst mal einen Logbefehl hin ;) .
Sowas langes ist auch besser in myUtils aufgehoben. Hier böte es sich an, $NAME und $EVENT zu übergeben.
Dann kannst du das auch noch besser testen, indem du nicht logst, sondern ein return "bla"; einbaust und statt bla dann die diversen Infos zurückgibst. Dann die Funktion mit entsprechenden Parmetern in der Kommandozeile aufrufen, schon hast du das in FHEMWEB angezeigt :) .
[$wecker] bedeutet genau was? (Klammern weglassen!)
Und hat einen nummerischen Inhalt? (vermutlich nicht => der Vergleich mit "<" geht nicht...)
Melde dich, wenn du das erst mal geändert hast
Hab x dinge schon geändert aber muss nun erst mal einkaufen usw.
Ich glaube auch das der Vergleich nicht klappt. Alle Wecker aus und dann auf disable geht wunderbar.
In Wecker steht das was er aus dem gerät ausgelesen hat. Es es sind immer werte wie uhrzeiten (06:10). Also es Soll ein Vergleich stattfinden um am ende den wecker mit der höchsten Zeit ausfindig zu machen. Ich glaube mittlerweile, ich Wandel die zeit in Sekunden oder so um und vergleiche dann. Hab keine idee mehr.
Das loggen selber mache ich aktuell mit log 1 und lasse mir da an verschiedenen stellen x Sachen ausgeben. Ohne log 1 wäre ich gar nicht soweit gekommen. Da war ich froh, sas die tage schon mal von euch gelernt zu haben.
Edit: den Teil ab ...hier böte es sich an... Verstehe ich nicht. Hab in meiner 98er bisher nichts stehen. Hätte auch gedacht das so ein Vergleich von unterschiedlich vielen Zeiten einfacher geht. Aber Training ist super. Das alles für nur ein Rollo 😂
Du brauchst dich nicht zu rechtfertigen, aber im Moment sehe ich in dem Code hier keine Log-Ausgaben; woher soll man ahnen, was du alles schon ausgetestet hattest ;) ?
Mit myUtils mußt du erst mal spielen. Wenn du das Wiki dazu gelesen hast, verstehst du evtl. auch, was gemeint ist ;) .
Und wenn die Zeitangaben wirklich alle im Format HH:MM sind, müßte auch ein alphanummerischer Vergleich das richtige liefern. Das ist aber nicht ">", sondern "gt" (usw. dasselbe für kleiner) ;) .
Okay - Folgendes habe ich herausgefunden:
1. Reading alarm_count nimmt für den Moment in dem ein Wecker aktiv/inaktiv geht genau dessen Nummer an. Habe ich einen Wecker mit der Zeit 07:10 auf Position 12. Wird als alarm_count genau dann ne 12 gesetzt und danach wird wieder die komplette Zahl an Wecker angezeigt.
Brauche also ein Reading was alles mit z.B. alarm_status zählt und als Zahl speichert. Bzw. ein korrektes Reading mit der Anzahl an vorhandenen Weckern. Das Reading aus dem Modul geht also für mich nicht. :-\
Wenn also nicht alle Wecker ausgewertet werden, kann auch nicht der richtige Wecker als letzter Wecker angezeigt werden....logisch
2. Der Vergleich der Zeiten klappt nicht. Egal ob ich mit if ("$wecker" gt "$lastalarmalexa") oder if ("$wecker" > "$lastalarmalexa") oder if ($wecker > $lastalarmalexa) oder if ([$wecker] > [$lastalarmalexa]) oder was ich noch alles probiert habe.....
Habe über die Comandline einfach mal getestet was so geht ... z.B. {"05:45" lt "07:10"} - Das geht wiederum (Ergebnis 1 / ist kleiner).
Also tatsächlich meine Frage: Wie baue ich einen Uhrzeiten-Vergleich in mein Konstrukt ein?
Wenn hier in diesem Konstrukt z.B. Wecker 07 mit der Zeit 07:10 und Wecker 12 mit der Zeit 05:45 verglichen werden, kommt am Ende immer einfach der Wecker mit der höheren Nummer rauß. In diesem Fall wäre es dann 05:45, da er die Nummer 12 trägt und somit am Ende erst gecheckt wird.
Aktuell:
(ECHO_123456:alarm_.._status:.(on|off)) {
my $k = "0";
my $alarmoff = "0";
my $schleifennr = "1";
my $lastalarmalexa = "0";
# foreach $k (1..ReadingsVal("$NAME", "alarm_count", ""))
foreach $k (1..16)
{
$schleifennr = sprintf("%02d", $k);
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");
$wecker =~ s/:00.000$//;
Log (1,"lastalarmalexa vor s: $lastalarmalexa");
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa")
{
Log (1,"wecker in s: $wecker");
Log (1,"lastalarmalexa in s: $lastalarmalexa");
fhem("setreading $NAME LastAlarm $wecker")
}
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;
if (sprintf("%02d", $alarmoff) eq $schleifennr)
{
fhem("setreading $NAME LastAlarm 0")
}
}
}
}
EDIT:
PROBLEM 1: OFFEN
PROBLEM 2: GELÖST! Code angepasst. Reading in Variable gesetzt und erst am Ende wieder zurück schreiben.
(ECHO_123456:alarm_.._status:.(on|off)) {
my $k = "0";
my $alarmoff = "0";
my $schleifennr = "1";
my $lastalarmalexa = "0";
# foreach $k (1..ReadingsVal("$NAME", "alarm_count", ""))
foreach $k (1..16)
{
$schleifennr = sprintf("%02d", $k);
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");
$wecker =~ s/:00.000$//;
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa")
{
$lastalarmalexa = $wecker;
}
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;
if (sprintf("%02d", $alarmoff) eq $schleifennr)
{
$lastalarmalexa = 0;
}
}
fhem("setreading $NAME LastAlarm $lastalarmalexa")
}
}