Hilfe - Letzter Wecker Funktion läuft nicht sauber

Begonnen von 87insane, 15 Februar 2019, 12:57:33

Vorheriges Thema - Nächstes Thema

87insane

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!

Beta-User

Falscher Forenbereich!
ZitatIn diesem Board bitte keine Themen mit Fragen starten, sondern ausschließlich funktionsfähige Codeschnipsel posten.
Verschieben, vorher sag ich nichts...!
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

Beta-User

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

87insane

#3
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 😂

Beta-User

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

87insane

#5
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")
}
}