Hauptmenü

mit DOIF Werte addieren

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

Vorheriges Thema - Nächstes Thema

dennis_n

Hi,

ich habe ein Problem und komme leider nicht auf den Fehler.

Ich möchte einen Wert aus einem Dummy A zu einem Wert in einem Dummy B dazu addieren.
Wie funktioniert das?

Ich habe folgendes DOIF:

(["Antwort"] eq "A")
(
setreading Ergebins ReadingA {(Value("dummy_a:ReadingA")) + (Value("Ergebnis:ReadingA"))},
setreading Ergebnis ReadingB {(Value("dummy_a:ReadingB")) + (Value("Ergebnis:ReadingB"))},
setreading Ergebnis ReadingC {(Value("dummy_a:ReadingC")) + (Value("Ergebnis:ReadingC"))})


Aber irgendwie funktioniert das nicht. Was mache ich falsch?

Danke

Gruss
Dennis

CoolTux

Hallo Dennis,

Genau die selbe Frage mit den selben Voraussetzungen hatten wir letzte oder vorletzte Woche hier schon. Bitte verwende einmal die Suche unterhalb des DOIF Forums.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dennis_n


dennis_n

Hi,

ich muss doch nochmal hier fragen, oder soll ich lieber im DOIF Forum einen neuen Thread anlegen?

Also ich addiere die Werte so, allerdings passiert da nichts:

setreading Funktion GF {([$DEVICE:GF] + [Funktion:GF])},
setreading Funktion AGT {([$DEVICE:AGT] + [Funktion:AGT])},
setreading Funktion MA {([$DEVICE:MA] + [Funktion:MA])})


Wenn ich so addiere, also ohne die geschweiften Klammern:
setreading Funktion GF ([$DEVICE:GF] + [Funktion:GF]),
setreading Funktion AGT ([$DEVICE:AGT] + [Funktion:AGT]),
setreading Funktion MA ([$DEVICE:MA] + [Funktion:MA]))


dann steht im Ergebnis "(0+1)". Also quasi nicht das Ergebnis sondern der Rechenterm.
Ich glaube ich habe hier nur ein Klammer bzw. Verständnisproblem bei der Addition, oder?

Gruss
Dennis

dennis_n

Kann mir niemand bei meinem Problem helfen? Ich denke es ist nur ein Syntax Problem, aber ich komme nicht drauf:

Im Prinzip mache ich folgende Rechenoperation:
setreading Funktion GF {( id_[$DEVICE:msgPeerId:GF] + [Funktion:GF])}

Ich muss den Wert, der im Reading GF im dummy id_4654984 steht, zum Reading GF im dummy "Funktion" hinzuzählen.
Aber wie greife ich denn von der Syntax her auf das Reading GF im dummy id_4654984 zu?

Denn so wie ich es aktuell habe, kommt ein Syntax Fehler.

Danke

Gruss
Dennis

Otto123

Hallo Dennis,

laut Doku geht das https://fhem.de/commandref_DE.html#DOIF_Berechnungen_im_Ausfuehrungsteil
Fang einfacher an, erstmal mit festen Werten und arbeite Dich hoch.

Reading GF im dummy id_4654984 -> [id_4654984:GF]

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

#6
Hallo Otto,

mit festen Werten habe ich ja getestet. Das funktioniert wunderbar. Nur sobald ich auf die dynamischen Werte zurückgreife bekomme ich einen Syntaxfehler.
Ab dem id_ können beliebig viele verschiedene Werte stehen. Jedes id_???? steht für ein eigenes dummy. Die Readings der dummys sind aber immer gleich aber mit unterschiedlichen Zahlen gefüllt.
Und diese Werte der Readings will ich in einem Gesamt-Dummy zusammenzählen.

Gruss
Dennis

CoolTux

Das liegt daran das wenn man Werte ein ließt, aus einem Dummy zum Beispiel, diese als String und nicht als Zahl eingelesen werden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dennis_n

Und es gibt keine Möglichkeit die Werte als Zahl einzulesen?

Es stehen in den Readings nur 0 oder 1 drin. Sonst nichts.

Gruss
Dennis

Otto123

Dann hat sich doch aber die Frage nach dem Syntax schon geklärt und deine Versuche weiter oben sind zum Teil als sinnlos erkannt?

Es gibt da folgenden Teil in der Doku, Groß und Kleinschreibung ist bei allem (außer in Windows) wichtig!
ZitatIn der Bedingung und im Ausführungsteil werden die Schlüsselwörter $SELF durch den eigenen Namen des DOIF-Moduls, $DEVICE durch das aktuelle Device, $EVENT durch die passende Eventzeile, $EVENTS kommagetrennt durch alle Eventzeilen des Triggers ersetzt.

Entsprechend können Perl-Variablen in der DOIF-Bedingung ausgewertet werden, sie werden in Kleinbuchstaben geschrieben. Sie lauten: $device, $event, $events

Ich versteh noch nicht wie die Namen der Dummys in dein DOIF kommen sollen?

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

CoolTux

Ich denke es liegt an DOIF. Ich müsste das auch erst testen.
Später
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

[Name:Reading:d] gibt den numerischen Anteil zurück.
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

#12
ok dann werde ich mal weiter ausholen:
Über Telegram schicken mir verschiedene Benutzer einen Status. Diesen Status der User schreibe ich jeweils in ein eigenes dummy.
Die Telegram ID 5356474 hat ein dummy namens id_5356474 und dort schreibe ich rein, wenn sich dieser User gemeldet hat. Genauso bei allen anderen Teilnehmner dieses telegram bot.

Zusätzlich sind in jedem dummy ein paar Fertigkeiten hinterlegt in Form von 0 oder 1. Wenn in einem Reading "Mechaniker" eine 1 steht, dann hat der User diese Fertigkeit. bei einer 0 eben nicht.

Und jetzt möchte ich unter allen Usern, die sich mit einem bestimmten Status gemeldet haben, die einzelnen Fähigkeiten zusammenzählen in einem extra Gesamt-dummy.
Ich will also zum Schluss in einem Dummy stehen haben, wieviele Mechaniker, wieviele Programmierer usw. sich gemeldet haben.

Es funktioniert bereits, dass sich die Leute erfolgreich melden und der jeweilige Text im jeweiligen dummy landet.
Was nicht funktioniert ist, wenn sich jemand mit OK gemeldet hat, dass seine entsprechenden Fähigkeiten in das Dummy "Funktion" geschrieben werden. Weil ich nicht weiß, wie ich anhand der verschiedenen ID's auf die Readings zugreife. Ich möchte also die Gesamtanzahl der Programmierer und der Mechaniker usw. haben. Als Zahl.

Aktuell sieht mein DOIF so aus:

(["Status:msgPeerId"] and ([?Status:msgText] eq "OK"))
(set id_[$DEVICE:msgPeerId] [$DEVICE:msgText],
setreading Funktion Mechaniker {(( id_[$DEVICE:msgPeerId]:Mechaniker) + [Funktion:Mechaniker])},
setreading Funktion Programmierer {(( id_[$DEVICE:msgPeerId]:Programmierer) + [Funktion:Programmierer])}


Gruss
Dennis

Otto123

Hi Dennis,

klingt kompliziert und eigentlich will ich den Text nicht komplett verstehen :)
Also wenn das wirklich funktioniert (habe ich nie probiert)
id_[$DEVICE:msgPeerId]
Dann ist das ( id_[$DEVICE:msgPeerId]:Mechaniker) Unfug und müsste so aussehen [id_[$DEVICE:msgPeerId]:Mechaniker:d]

Aber das ist nur aus dem was ich zu wissen glaube hergeleitet.  ::)

Ich weiß nicht ob man dort [] schachteln kann, ich weiß auch nicht ob man ReadingsNum() schachteln könnte. Im Zweifel musst Du Perl aufmachen und mit Variablen die einzelne Werte zwischen speichern.

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

#14
Nö, funktioniert leider nicht.

Mal noch anders gefragt:

setreading Funktion Programmierer {(10 + [Funktion:Programmierer])}

Bei diesem Beispiel zählt er mir jeweils 10 zu dem bereits enthaltenen Wert im Reading "Programmierer" hinzu.

Wie ersetze ich jetzt aber die "10" mit dem Wert, der im dummy id_[$DEVICE:msgPeerId] im Reading Programmierer steht? Das ist mein Problem.

Gruss
Dennis