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

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

Vorheriges Thema - Nächstes Thema

Otto123

Geht relativ simpel :)
https://forum.fhem.de/index.php/topic,106368.msg1002167.html#msg1002167

Aber eigentlich kennst Du ja die Readings.
dann kannst Du die Namen einfach in ein Array schreiben, so wie hier etwa:
https://forum.fhem.de/index.php/topic,107449.msg1015141.html#msg1015141

Gruß Otto
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

Wenn man drauf gestossen wird ist alles ganz klar ::)

Da muss ich viermal ReadingsVal verwenden, hab noch nicht auf L_-Readings umgestellt aber kürzer wäre der Code am Ende wenn es eine Funktion gebe,  die mir -wie ich im edit schon angemerkt habe- den Inhalt aus allen L_.*-Readings in eines schreibt  8)

Gibts diese Funktion ?

Otto123

bei Readings funktioniert normalerweise kein .* oder so.

Warum viermal ReadingsVal? Schleife über Array?

ich habe aber dein eigentliches Problem nicht verstanden. Was ist schlimm an den Readings? Hast Du ein Beispiel?
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

#48
defmod doif_Muelll_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;;;\
my $val1 = (ReadingsVal("Google_Abfallkalender","nextWaste","0"));;;;\
$val1 =~ s/_.*//;;;;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")+1);;;;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
({ \
my $val = "Google_Abfallkalender";;;;\
my $val1 = (ReadingsVal("Google_Abfallkalender","nextWaste","0"));;;;\
$val1 =~ s/_.*//;;;;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")-1);;;;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
({\
my @array = ("ReadingsVal("Google_Abfallkalender","Restabfall/Wertstoffe","0")","ReadingsVal("Google_Abfallkalender","Bioabfall","0")","ReadingsVal("Google_Abfallkalender","Schadstoffe","0")","ReadingsVal("Google_Abfallkalender","Hecken und Baumschnitt","0")");;;; foreach my $Aa (@array){fhem ("setreading Google_Abfallkalender $Aa 0")} })\
\

attr doif_Muelll_Count alexaName tonnenleerung
attr doif_Muelll_Count cmdState on|off
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung
attr doif_Muelll_Count setList on off


Der dritte Ausführungsteil ist nicht fertig, und klappt auch noch nicht, du frägst zu früh.
Hoffe man kann nachvollziehen was ich vorhabe.

TomLee

Sry zweimal falschen code geposted jetzt passts.

Otto123

ganz auf Schnelle ;;;; -> ;; zwei reichen normal :)
Wobei ich nicht weiß, wie man Perl Code in ein DOIF schreibt  ::)

ich würde nur die ReadingsNamen in das Array packen und dann ReadingsVal( "Google_Abfallkalender", $Aa,0)

Gruß Otto
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

es sind zwei ; in der DEF




ja ja wenn mans richtig macht, frag mich nicht was ich mir dabei gedacht hatte.
Mit der Readingname Angabe klappts.

Wo ich ReadingsVal( "Google_Abfallkalender", $Aa,0) einsetzen soll komm ich noch nicht mit.

So kann mans machen und es funzt:
({
my @array = ("Restabfall/Wertstoffe","Bioabfall","Schadstoffe");;
foreach my $Aa (@array)
{fhem ("setreading Google_Abfallkalender $Aa 0")}})


Und um auf die ursprüngliche Frage zurückzukommen, die Angabe der Readingnamen in Wort und Schrift wollte ich mir sparen.
Wenn ich jedem Readingname ein L_verpasse, wie bekomme ich diese dann ins Array ?

Otto123

In der DEF braucht es nur ein ;  ;)

ReadingsNamen: ich habe keine Idee Idee mit dem L_ - geht eventuell irgendwie ...
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

Damian

Ich benutze für den Abfallkalender (Modul ABFALL) Aggregationsfunktionen, um die nächste Leerung zu bestimmen:

z. B.

attr Abfall DOIF_Readings bio:[#min:"^abfall$":"Bioabfall.*_days$"], GelberSack:[#min:"^abfall$":"GelberSack.*_days$"], Gruenschnitt:[#min:"^abfall$":"Gruenschnitt.*_days$"]

siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Danke, mir gehts aber darum das Abfall-Modul nicht nutzen zu müssen.


Man muss es gar nicht so kompliziert, die Readings werden doch mit setreading eh wieder neu gesetzt, einfach mit deletereading löschen  :P

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

attr doif_Muelll_Count cmdState on|off
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung


@Damian
sobald ich cmd3 mit rein nehme wird cmd2 nicht mehr ausgeführt, nehm ich cmd3 raus klappt wieder cmd1 und cmd2.
War der Meinung den cmd3 nehm ich dann mit DOELSE auf, dann gibts aber einen error, der Befehl wird aber ausgeführt.
Nehm ich DOELSEIF für cmd3 gibts keinen error und wird auch ausgeführt.
Hast du bitte einen Tipp ?

TomLee

So klappt jetzt alles, es gibt aber weiter das error-Reading zu cmd3 obwohl er ausgeführt wird:

error deletereading Google_Abfallkalender L_.*: Deleted reading L_Bioabfall for device Google_Abfallkalender

defmod doif_Muelll_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$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("Google_Abfallkalender","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
(deletereading Google_Abfallkalender L_.*)\
\

attr doif_Muelll_Count cmdState on|off|reset
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung
attr doif_Muelll_Count setList on off

Damian

Error gibt es immer dann, wenn der Befehl etwas ungleich 0 zurück liefert. Das wird wohl bei deletereading  der Fall sein. Du kannst dahinter eine leere Befehlsausführung dranhängen um die Fehlermeldung zu beseitigen

(deletereading Google_Abfallkalender L_.*)()
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee


TomLee

Was läuft denn jetzt schief ?

Ich kopiere mir die funktionierende Raw Definition aus dem Test-System und füge sie über das Plus am Haupt-Server ein oder kopiere einfach die DEF.
Hier wird nicht mehr addiert/subtrahiert, es wird je nach Kommando der Wert (1/-1) in das Reading geschrieben, cmd_3 wird korrekt ausgeführt
Beide System sind up to date.

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("Google_Abfallkalender","$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("Google_Abfallkalender","$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

Otto123

was gibt denn dies in der FHEM Kommandozeile zurück?
{ReadingsVal("Google_Abfallkalender","state","geht nicht")}

Entweder der Kalender existiert nicht oder die Readings :)
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