[gelöst] Wie die Tage jetzt ohne Komma ?

Begonnen von TomLee, 24 August 2019, 15:31:52

Vorheriges Thema - Nächstes Thema

TomLee

Natürlich existiert der Kalender, ich schiebe doch die DEF die letzten drei Tage hin und her, das ist bisher bis auf heute kein Problem gewesen und funzte ganz normal. Jetzt wo ich im FTUI an den Switches rumspiele die dort auch die Befehle ausführen sollen können bemerk ich diese Kuriosität und finde den Fehler nicht. Hab doch alles 1:1 auf jedem Server
Unter jedem Gerät steht bei Probably associated with ja auch das richtige Gerät und die Readings existieren, der Zeitstempel ändert sich ja auch wenn jetzt eine 1 bei cmd_1 und eine -1 bei cmd_2 in das Reading geschrieben wird.

TomLee

Auf dem Hauptsystem hat es was mit der Variablen $val1 zu tun.
Wenn ich zum testen L_Bioabfall verwende wird wieder gerechnet.
Kann es was mit der jeweils verwendeten Perl-Version zu tun haben ? Das Testsystem läuft mit Buster, das Hauptsystem mit Stretch.


($SELF eq "on") ({
my $val = "Google_Abfallkalender";
my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";
my $val2 =(ReadingsVal("$val","L_Bioabfall","0")+1);
fhem("setreading $val L_Bioabfall $val2")})
DOELSEIF
($SELF eq "off")
({
my $val = "Google_Abfallkalender";
my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";
my $val2 =(ReadingsVal("$val","L_Bioabfall","0")-1);
fhem("setreading $val L_Bioabfall $val2")})
DOELSE
(deletereading Google_Abfallkalender L_.*)()

Otto123

Es gibt in jeder Programmiersprache Entwicklungen, oft wird dabei der Syntax bereinigt. Ich sehe das bei deinem Code nicht. Außerdem wird bei Perl auch das "Meckersystem" immer besser :) d.h. Du solltest Warnungen oder Fehler im Log haben.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Nichts, keine Meldungen, keine Fehler. Gleiche DEF, in einem System (Test) wird gerechnet, im anderen (Haupt) 1 bzw. -1 -je nach Befehl- ins Reading geschrieben.

TomLee

Es klappt auch nicht wenn man ReadingsNum verwendet.

Otto123

Mein Tipp: schreib den Code nicht in ein DOIF sondern in die 99_myUtils.pm (Es gab mal irgendwo hier die Aussage: Mehr als eine Codezeile gehören dort hin) :D

Jetzt bist Du: in der Runden Klammer / in der Perl Klammer / im DOIF - ich weiß nicht was und an welcher Stelle da etwas passieren kann. :-[
Eigentlich braucht man die nicht: "$val" -> $val - ich weiß aber auch, manchmal braucht man sie, manchmal macht es keinen Unterschied. Der Variablen Name muss durch Inhalt ersetzt werden, wer macht das, wann macht er das ...

Im Zweifel musst Du in jeder Zeile einfach eine Zeile ins Log schreiben, damit Du siehst was gerade mit deinem Code passiert.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Auch wenn ich eine myUtils nehme ändert das nichts.

Fakt ist :

Auf beiden System steht in L_Bioabfall 4

Aus der Kommandozeile auf dem Test-System kommt mit
{ my $val = "Google_Abfallkalender";; my $val1=(ReadingsVal($val,"nextWaste","0"));;$val1 =~ s/_.*//;;$val1 = "L_"."$val1";; my $val2 =(ReadingsNum($val,$val1,"0"));;return $val2 }
eine korrekte 4 zurück deshalb klappt auch alles.

Und auf dem Hauptsystem mit der gleichen Zeile eine 0.
Da kann ich soviel Logausgaben machen wie ich will, es bleibt bei der Erkenntnis aus Post #61, die Variable $val1 in dem ReadingsNum von val2 wird egal ob mit " oder ohne nicht übergeben/erkannt wie auch immer.

Otto123

#67
Mal eine Stelle in deinem Code reduziert:
{my $a="L_Bioabfall";;$a =~ s/_.*//;;return $a}
Da kommt L raus ?

Und im nächsten Schritt machst daraus L_L ;)

Oder ich habe es nicht verstanden.  :-[
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Nee, nee ist schon richtig oder ich versteh dich jetzt falsch.

In nextWaste hängen die verbeibenden Tage noch  mit _ hinten daran -Bioabfall_4- die entferne ich erstmal und hänge dann an Bioabfall ein L_ an.

Otto123

Na ok, Du wirst es wissen. Mir ist dieses Gefummel eh zu hoch ;)
Ich habe ein Reading da steht die nächste Tonnenart drin und ein Reading da stehen die Tage drin bis es soweit ist. Das ist immer aktuell - auch zum Jahreswechsel.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Und was spricht dagegen wenn ich das mit einem Reading gelöst habe in der die Tonnenart und die Tage gemeinsam dargestellt werden -auch zum Jahreswechsel ?

Du hast schon verstanden das es um das zählen der rausgestellten Tonnen geht ?

Warum das jetzt Fummelei sein soll den Inhalt aus nextWaste in ein neues Reading zu bekommen, um dort dann die Anzahl der rausgestellten Tonnen reinzuschreiben verstehe ich nicht  :-[

Otto123

Nö ehrlich ich habe es nicht verstanden :) aber ich habe immer versucht mit zu denken. 😇
Aber Du musst zugeben Du fummelst jetzt schon seit dem Jahreswechsel am Reset der Readings rum. ;)

Manchmal muss ja auch neu drüber nachdenken.

Warum fummelst Du hinten was ab und vorne was dran, warum hältst Du die Daten nicht getrennt und fügst sie immer aktuell zusammen?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Jahreswechsel ? seit Dienstag-Mittwoch, gefragt hatte ich am Freitag.

https://forum.fhem.de/index.php/topic,103238.msg1018939.html#msg1018939

ZitatWarum fummelst Du hinten was ab und vorne was dran, warum hältst Du die Daten nicht getrennt und fügst sie immer aktuell zusammen?

Meine Ftui-Lösung, mit nur einem Reading.

Mit dem DOiF würden zu meiner Abfalllösung eigentlich nur noch zwei Readings dazukommen (raus stelle ich den Restabfall und Bioabfall), wo man die Leerungen hinschreibt ist ja egal ich hab mich dazu entschieden wie bei den Abholtagen in das Calendar-Device.

Mit der DOIF Lösung könnte ich am Abholtag Alexa sagen Tonnenleerung an (über eine Routine) oder im Ftui nach Tipp auf die Tonnenart in dem aufgehenden Popup via Switch und das entsprechende Reading zu nextwaste würde um eins hochgezählt.

Am Jahresende könnte man über cmd_3 die entsprechenden Readings wieder löschen .

Das macht doch alles schon:

defmod doif_Muell_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("$val","$val1","0")+1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
($SELF eq "off")\
({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("$val","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
(deletereading Google_Abfallkalender L_.*)()
attr doif_Muell_Count cmdState on|off|reset
attr doif_Muell_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muell_Count do always
attr doif_Muell_Count room Sprachsteuerung
attr doif_Muell_Count setList on off
attr doif_Muell_Count alexaName tonnenleerung


Bloß nicht auf dem Server wo ichs brauch  ;D

Ich möchte dich bitten das mal nachzuvollziehen.
Nimm statt Google_Abfallkalender einen Dummy Google_Abfallkalender und verpasse diesem ein Reading nextWaste mit dem Wert Bioabfall_4.

cmd_1 des DOIF sollte beim ersten Mal ein Reading L_Bioabfall erstellen mit einer 1 als Wert jedes weitere cmd_1 erhöht das Reading um eins, jedes cmd_2 zieht eins ab, cmd_3 löscht das Reading L_Bioabfall.

Damian

#73
Ich habe mir jetzt mal calendar genauer angeschaut. Es ist mit wenigen Zeilen möglich, ohne zusätzliche Abfall-Module, die Tage zur Leerung in Readings zu packen und zu visualisieren, mein Code:

defmod myabfall DOIF subs {\
  sub days \
  {\
    my ($event)=@_;;\
    set_Reading($event,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()))\
  }\
}\
init {[00:05];;fhem("set cal reload");;days("Altpapier");;days("Restmüll");;days("Bio");;days("Gelber");;days("Grünschnitt");;\
}
attr myabfall uiTable {\
  $TC{0..4}="align='center'";;\
  $SHOWNOSTATE=1;;\
}\
IMPORT ./contrib/DOIF/my_uiTable.tpl\
bin("yellow",[$SELF:Gelber])|bin("blue",[$SELF:Altpapier])|bin("grey",[$SELF:Restmüll])|bin("green",[$SELF:Bio])|bin("greengreen",[$SELF:Grünschnitt])


Um Mitternacht wird der Kalender aktualisiert und die entsprechenden Readings mit der Anzahl der Tage für die verschiedenen Abfallsorten erstellt. Zusätzlich habe ich sie noch über uiTable visualisiert. Die Funktion "bin" stellt die Eimer mit dem Counter dar.

Ergebnis im Anhang:
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

#74
Mich interessiert nur der nächste Termin und den gibts mit folgendem userreadings im Calendar-Device das aus diesem Thread entstanden ist.

nextWaste {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin.|in.|Buxtehude.|am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}


Eine Anzeige in FHEMWEB brauch ich nicht, mir reicht das Reading für den nächsten Termin im FTUI, das Thema ist seit letzten September -dank Otto- gegessen.

Mir gehts jetzt um das zählen der Leerungen, dazu hab ich mir zu meiner userreadings-Lösung das DOIF ausgedacht, sry wenn ich dazu keinen neuen Thread aufgemacht habe.

Nochmal:Das Doif funkioniert ja, nur nicht -bis jetzt- in meiner Haupt-Instanz.

Aussehen soll das am Ende im FTUI ähnlich wie im Anhang gezeigt wenn man auf Bioabfall tippt und dort wird auch nur eine Tonne angezeigt und zwar die die auf dem userreadings basiert.