Hauptmenü

mit DOIF Werte addieren

Begonnen von dennis_n, 25 Februar 2018, 11:23:20

Vorheriges Thema - Nächstes Thema

Damian

id_[$DEVICE:msgPeerId:GF]  so etwas geht nicht. Hinter [$DEVICE:msgPeerId:GF] steckt eine Perlfunktion, da kannst du nicht etwas davor oder dahinter hängen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dennis_n

Aber wenn ich es so schreibe:

[$DEVICE:msgPeerId:Programmierer]

bekomme ich den Fehler:
ZitatDOIF: unknown expression format: Programmierer

Otto123

#17
Ich bin kein Perl Programmierer  ::) also nur meine Idee von oben umgesetzt. Du könntest bei Dir Teile davon direkt in der Kommandozeile testen.

Für die DEF!
{my $a = ReadingsVal("$device","msgPeerId","");return ReadingsNum("id_".$a,"Mechaniker",0)}

Falls DOIF sowas zulässt sollte der Code oben die 10 ersetzen. Ob das klappt, keine Ahnung.

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

Otto123

#18
Zitat von: dennis_n am 25 Februar 2018, 18:21:10
Aber wenn ich es so schreibe:

[$DEVICE:msgPeerId:Programmierer]

bekomme ich den Fehler:
Das ist auch einfach Unfug ... an der Stelle geht nicht irgendwas sondern so etwas wie d (Zahl filtern)
ZitatAb featurelevel 5.7 ersetzt das set und setreading Befehl
[device:name] mit dem Wert des Readings, Internals oder Attributes für device, falls sowohl device, als auch Reading, Internal oder Attribut existiert, und nicht leer ist.
Man kann einen der Präfixe r:, i: oder a: verwenden, um die Suche einzuschränken, genau wie im devspec.
Das Suffix :d extrahiert die erste Zahl.
Das Suffix :i extrahiert die erste Zahl als Ganzzahl.
Das Suffix :r<n> extrahiert die erste Zahl, und rundet sie auf <n> Dezimalstellen. Falls <n> fehlt, dann wird auf eine Dezimalstelle gerundet.
Das Suffix :t liefert den Zeitstempel des Readings
Das Suffix :sec liefert Anzahl der Sekunden seit Änderung des Readings.
Beispiel:
set Lamp blink [blinkDummy:number] [r:blinkDummy:duration:d]

Sinnloses Zeug probieren bringt nichts, Du musst schon ein bisschen in die Doku schauen!
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

Ellert

Zitat von: dennis_n am 25 Februar 2018, 18:21:10
[$DEVICE:msgPeerId:Programmierer]
Wo hast Du diese Syntax gefunden?

dennis_n

Danke Leute, aber ich bekomme es einfach nicht hin. Auch nach lesen der Doku, beiße ich mir die Zähne daran aus. Ich bin halt kein Programmierer.  :'(

Wenn mir das niemand anschaulich erklären kann, muss ich aufgeben.
Ich kann ja verstehen, dass das für jemanden sehr zeitintensiv sein kann, einem Nicht-Programmierer soetwas zu erklären. Aber daher schreibe ich ja auch im Anfängerforum. Ich würde es gerne verstehen.

Speziell für meinen Anwendungsfall mit der Abfrage der unterschidlichen User (z.B. id_7796976) bekomme ich das nicht hin. Mir leuchtet die Syntax einfach nicht ein.

Gruss
Dennis


Otto123

Moin,

und welchen Fehler bekommst Du bei meinem Code aus #17?

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

dennis_n

Moin Otto,

da bekomme ich keinen Fehler. Das funktioniert. Sorry, ahbe vergessen dazu Rückmeldung zu geben.

Mir geht es allerdings um die Syntax mit dem :d usw. Das verstehe ich einfach nicht und würde es gerne für die Zukunft verstehen. Mir leuchtet die Syntax ja auch ein, wenn ich ein ganz normales Device habe. Sobald ich aber ein Devicenamen aus "id_" und einer belieben Zahl habe, verstehe ich nicht, wie ich das Device anspreche.

Gruss
Dennis

Otto123

Hi,

du verstehst die klare Aussage von Damian nicht:?
Zitatid_[$DEVICE:msgPeerId:GF]  so etwas geht nicht.

Und Du verstehst mein Zitat aus der Doku nicht? Das Du nicht :GF schreiben kannst weil das der Programmierer dort nicht vorgesehen hat und nur ein festgelegtes Set an Parametern gilt?
:o :o :o
Irgendwie versteh ich das jetzt nicht!

Das Du Device Name nach Deinem Konstrukt erzeugst und anschließend nicht weißt wie Du sie ansprichst ist doch selbsterzeugtes Leid?  ;D
Und für diesen eigenartig komplizierten Fall hast Du doch sogar eine Lösung, auch wenn die nicht elegant aussieht - oder?

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

dennis_n

Hallo Otto,

natürlich verstehe ich, dass es nciht geht, weil es der Programmierer nicht vorgesehen hat.
Ich hatte Deine Aussage und Deinen verweis auf die Doku allerdings so verstanden, dass es eine elegantere Lösung gibt und nur ich nciht auf die Lösung komme.

Egal, Dein Weg habe ich jetzt übernommen und alles funktioniert. Daher danke ich Dir für Deine Geduld mit mir  :-*

Gruss
Dennis

Otto123

nein, mein letzter Hinweis zur Doku war einfach so gemeint: Es macht keinen Sinn sich einen Syntax der schön und einfach aussieht und an andere Stelle vielleicht sogar so ähnlich aussieht zusammen zu basteln und dann zu wundern, dass es nicht geht. Wenns nicht geh,t muss man in die Doku schauen wie der Syntax wirklich ist.
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

dennis_n

#26
Hallo Otto,

leider, leider habe ich gerade im Test mit mehreren Personen festgestellt, dass es doch nicht funktioniert wie es soll.

Aktuell sieht es so aus:
setreading Funktion Programmierer {({my $a = ReadingsVal("$device","msgPeerId","");return ReadingsNum("id_".$a,"Programmierer",0)} + [Funktion:Programmierer])},

Was dabei passiert ist, dass die Rückmeldung der einzelnen Personen nicht im dummy Funktion addiert werden, sondern immer mit dem letzten, der sich meldet überschrieben wird.

Wenn sich also jemand meldt, der in seinem id_8789879 dummy Programmierer = 0 stehen hat, dann wird dieser Wert in den dummy Funktion geschrieben und wenn jemand bei id_535363 Programmierer = 1 stehen hat, dann wird dieser Wert in den dummy Funktion geschrieben.

Ich will ja aber die zusammenzählen, die sich mit Programmierer = 1 gemeldet haben.

Gruss
Dennis


Otto123

Hallo Dennis,

ich weiß nicht genau, was innerhalb eines DOIFs für Schweinereien gehen, aber im setreading funktioniert dein Code nicht.
Du machst quasi {Perl(Rechnen{Perl} + [fhem])} das funktioniert nicht. Da solltest Du eigentlich einen Syntaxfehler bekommen.
Es ist relativ leicht so etwas separat zu testen, da musst Du mal hinkommen. Sonst verstehst Du das nicht!

Also die Idee:Bleib doch einfach innerhalb von Perl.

Was laut Doku geht ist setreading Device reading {Perl}
Wie habe ich getestet? Mit einem dummy wert. Der hat im state ein Zahl. Das folgende Beispiel in der FHEM Kommandozeile gibt einen Fehler innerhalb des Readings zurück!
setreading wert Text_wert {({(my $a=5;;my $b=$a*2;;return $b)} + [wert:state])}
BTW das return ist unnötig, dass braucht man nicht. Schlimmstenfalls stört es sogar!  :-[

Was an Varianten geht ist (getestet)setreading wert Text_wert {(my $a=5;;my $b=$a+2)}
setreading wert Text_wert {(my $a=5;;my $b=$a+ReadingsNum("wert","state",0))}
setreading wert Text_wert {(my $a=5;;$a+ReadingsNum("wert","state",0))}

Man kann die letzte Zuweisung offenbar weglassen, der Rückgabewert ist die letzte Operation. Wie gesagt, ich probiere auch bloß ...

Also für Dich sollte dies gehen (im DEF Editor einfügen){(my $a = ReadingsVal("$device","msgPeerId","");ReadingsNum("id_".$a,"Programmierer",0) + ReadingsNum("Funktion","Programmierer",0))}

Mir ist die Notwendigkeit der zweiten Klammer () noch nicht ganz klar. Bei den Test in der Kommandozeile ist das Ergebnis ohne Klammer nur die Formel, mit Klammer wird gerechnet und der Wert zurückgegeben.

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

dennis_n

Jetzt funktioniert es bestens, Otto.

Vielen vielen Dank.

Gruss
Dennis