Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ja - aber das Item ist ja nicht gesetzt worden, sondern hat die Berechnung über eval_trigger angestoßen... ?
Doch. Ein
knx_listen (Trigger vom KNX-Plugin),
eval_trigger (Trigger vom anderen Item),
cycle (Trigger vom Laufzeitsystem vom shNG),
nw_udp_listen (Trigger vom Network-Plugin)
...
alles sind attribute, die ein Item triggern. Der Trigger bringt einen neuen Wert mit (im value) und setzt diesen Wert. Wenn da noch ein eval steht, dann wird eben dieser eval mit dem neuen Wert ausgeführt, damit man noch vor dem setzen was machen kann. Einzige mir bekannte Ausnahme: der eval_trigger setzt den value nicht ohne einen eval.
Im Prinzip ist das shNG mit seinen Items und Triggern genau so Eventbasiert wie der KNX-Bus mit seinen KO und GA.
Leider nein, das ist aber auch ein Fall, den man ausprobieren muss, weil es wirklich auf die Telegrammreihenfolge in den jeweiligen Situationen ankommt. Da es bei Dir um die Beseitigung von Randerscheinungen bei Neustart geht, musst Du aber immer alle Fälle testen:
Neustart nur vom shNG
Neustart nur vom Zähl-Interface
Neustart durch Stromausfall
Letzteres ist immer am schwierigsten zu behandeln, denn die Bootzeit von shNG führt häufig dazu, dass man irgendwelche Telegramme auf dem Bus verpasst. Ob dann die entsprechenden Werte nachgelesen werden können, hängt von der jeweiligen Anwendung ab.
Und im Fall 1. und 3. weiß ich konkret in dem Fall nicht, wie prev_value gesetzt ist...
Danke erstmal für die Erläuterung. Dass value jetzt der Wert von einem anderen Item ist, hätte ich nicht erwartet... aber ok. D.h., dass knx_input schon neu gesetzt ist - und wieso dann nicht last_value sondern prev_value, also der vorletzte Wert?
Und zu deiner Vermutung: es ist ja der prev_value von knx_input, nicht von ruecklaufsperre, der sollte ja vorhanden sein.
Ich wäre mir nicht sicher, ob das Timing zwischen bezug und ruecklaufsperre deteministisch ist. Ich vermute, dass Michael das getestet hat und es bei ihm funktioniert. Ich halte es trotzdem für ... schwierig. Aber man lernt dabei, und es gibt immer mehrere Wege
Da dieses Item triggert, steht dessen Wert im "value". Wenn dieser Wert 0 ist, wird der vorherige Wert von knx_input genommen, sonst passiert gar nichts.
Ich meine aber, das kann nicht funktionieren:
Neustart shng: es kommen Werte > 0 an, das if läuft immer auf "None"
dann wird der Zähler neu gestartet und liefert eine 0 -> im Item gibt es aber kein prev_value, weil das if immer auf None lief.
ItemXYZ: type: number eval: value if sh..() < value else sh..() + value
Ich bin mir nicht sicher, ob das mit der relativen Adressierung korrekt ist, da müsstest Du nochmal in die Doku schauen, ich hab schon lange nichts mehr mit shNG gemacht. Gemeint ist aber, dass sh..() das ItemXYZ selbst adressiert.
Danke.
Ich habe gemerkt, dass da noch ein Denkfehler drin ist.
Wenn der KNX-Zähler resettet wurde (u.a. durch Busspannungsausfall), dann ist dessen Wert (also das value) dauerhaft niedriger, da das ItemXYZ ja den Gesamtcount enthalten soll.
Man muss also den Wert des Gesamtcounts sichern, wenn der neue Wert 0 oder besser 1 ist (0 kommt auch erstmal beim Restart von shNG) bis cache oder DBinit den Itemwert wieder hergestellt haben. Das muss dann über ein Hilfsitem passieren.
nun möchte ich prüfen, ob der neue, über KNX empfangene Wert, der in "value" zwischengespeichert wurde, größer ist, als der Wert dem aktuell im Item steht.
Wenn ja, soll der Wert ins Item, wenn nicht soll der neue Wert auf den aktuellen addiert werden.
wenn ich Dich richtig verstehe, ist das genau das, wofür ursprünglich eval gedacht war:
Code:
ItemXYZ:
type: number
eval: value if sh..() < value else sh..() + value
Ich bin mir nicht sicher, ob das mit der relativen Adressierung korrekt ist, da müsstest Du nochmal in die Doku schauen, ich hab schon lange nichts mehr mit shNG gemacht. Gemeint ist aber, dass sh..() das ItemXYZ selbst adressiert.
Wichtig hier: value in einem eval enthält schon den neuen Wert, wogegen ItemXYZ noch den vorherigen Wert enthält.
Ich habe mir nochmal Gedanken gemacht, brauche aber von den Experten Msinnmumpf kurze Rückmeldung bzw. Bestätigung.
über das KNX-Plugin kommt der KNX-Zählerstand auf mein Item und wird dort erstmal "value" zugewiesen. Da mit "value" nicht weiter gearbeitet wird, wird der über KNX empfange Wert dem Item zugewiesen.
nun möchte ich prüfen, ob der neue, über KNX empfangene Wert, der in "value" zwischengespeichert wurde, größer ist, als der Wert dem aktuell im Item steht.
Wenn ja, soll der Wert ins Item, wenn nicht soll der neue Wert auf den aktuellen addiert werden.
Meine Frage ist, wie ich an den aktuellen Wert des Items komme?
Ist
Code:
prev_value()
die richtige Funktion? Mein Verständnis ist, dass ich damit an den letzen Item Wert komme.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: