set ohne Event möglich?

Begonnen von Guybrush, 19 Juli 2022, 11:11:12

Vorheriges Thema - Nächstes Thema

Guybrush

In der CommandRef finde ich dazu nichts, aber gibt es eine Möglichkeit mittels set den state eines devices zu aktualisieren ohne dass bei diesem ein event ausgelöst wird? Das kann man ja grundsätzlich bei ReadingsSingleUpdate() als Parameter bestimmen, aber bei set ist mir das nicht bekannt? ReadingsSingleUpdate kann ich auch nicht nutzen, da Notify den Hash nicht mit übergibt.

Mein Problem ist nämlich, dass ich Devices aus FHEM ein-/ausschalte, diese aber auch über KNX Taster gesteuert werden können. Auf den KNX Tastern ist ein Notify gebunden, was den State 1:1 bei den Devices überträgt (kein KNX, daher keine direkte Kommunikation zwischen Taster und Devices möglich). Das funktioniert soweit gut. Den Status des Devices erkennt FHEM auch, weshalb ich innerhalb von FHEM immer den aktuellen Status habe. Nun habe ich aber das Problem, dass die Devices auch händisch eingeschaltet werden können. Der Status wird von FHEM richtig aktualisiert, aber der KNX Taster bekommt davon nichts mit.

Das könnte man grundsätzlich ja auch per Notify machen, nur würde das dann einem endlosen Pingpong führen oder zumindest zu einem einem redundanten Ein/Ausschalt Befehl. event-min-interval kann ich nicht nutzen, da die Zustandsänderung des Devices mal sofort, mal aber auch Sekunden braucht und dann die Taster innerhalb des Devices nicht mehr wie gewollt funktionieren. Hier müsste ich also einen Interval bestimmen, innerhalb dessen in jedem Fall die Änderung durch wäre. Wenn man innerhalb des Interval aber den Zustand nochmal ändern würde, wäre der State wieder unterschiedlich. Ich bräuchte also eine Möglichkeit den State einer KNX Adresse zu aktualisieren, ohne dass ein Event gefeuert wird.

Übersehe ich hier irgendwas offensichtliches oder ist die einzige Möglichkeit das zu tun, dass man sich im Notify anhand von $NAME den $hash aus $modules holt? Also in etwa so:


define event notify <DEVICE> {
  $hash = $modules{<Modul>}{defptr}{$NAME};
  readingsSingleUpdate($hash, "state", $EVENT, 0);
}

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

(etwas zu spät, aber wg. des 2. Teils)
Vielleicht hilft "setstate"?

Ansonsten kommst du an den Hash über $defs{DEVICE}, wobei readingsSingleUpdate in notify irgenwie unschön ist...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Guybrush

setstate macht leider genau das anders herum was ich brauche

setstate KNXDEVICE off

Notify auf KNXDEVICE wird ausgeführt, aber State wird nicht an KNX gesendet. Ich brauche etwas, was den State an KNX sendet ohne den Trigger auf KNXDEVICE auszuführen

Beta-User

#4
Klingt für mich nach einem speziellen KNX-Problem, wenn du da auch irgendwas auf den Bus senden willst. (=> wäre wohl im KNX-Unterforum besser aufgehoben).
Bzgl. des notify hilft vielleicht (!) disabledAfterTrigger.

Nachtrag: Vielleicht wäre es eine Option, das über eine structure zu lösen und die dann immer nach dem zuletzt geschalteten (Einzel-) Gerät zu schalten?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Guybrush

also meines Erachtens nach ist das eher allgemein. Das ist ja hier nur ein konkretes Beispiel wo ich es brauche. Grundlegend dürfte das aber alle Module betreffen, solang hier 2 Module untereinander über notify kommunizieren.

disabledAfterTrigger wäre vielleicht eine Möglichkeit. Allerdings ist auch hier ein fester Sekundenwert anzugeben, was das auch wieder einschränkt :( . Jedenfalls interpretiere ich den code so, dass das Notify für die angegebene Zeit schlichtweg nur nicht ausgeführt wird. Theoretisch kann man also eine Taste da 2x hintereinander drücken, so dass mehrere Zustände innerhalb einer 1 Sekunde an den KNX Bus gesendet werden. Dann hat man wieder das Problem, dass es nur funktioniert, solang das keiner macht.

Beta-User

#6
Vielleicht zeigst du mal das notify und lists von den Devices.

Wenn das (eigentlich) zwei Aktoren sind, sollte ein FILTER im notify (das auf Events beider Geräte hört) eigentlich ausreichend sein (schalte das Gerät, das nicht schon auf $EVENT steht auf $EVENT).

EDIT: so wie hier - https://forum.fhem.de/index.php/topic,124253.msg1188254.html#msg1188254
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Thyraz

Ich bin mir nicht 100% sicher ob ich alles verstehe was "State übertragen" etc. genau bedeutet an Schaltlogik in und außerhalb FHEM.
Denke auch ein List der betroffenen Devices hilft vielleicht zielgerichteter zu helfen.

Was musst du denn beim KNX Taster "setzen", wenn du nicht über ihn schaltest?
Hat der ein Display und du willst ihn zur Korrekten Anzeige zwingen indem du nochmal den Status setzt der eigentlich durch FHEM schon aktiviert wurde?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Guybrush

Der Taster hat LEDs die den Zustand des Schaltobjektes anzeigen. Wenn das Gerät angeschaltet wird, soll also auch die LED leuchten, damit mans am Taster sieht, so dass die KNX Busadresse eben den richtigen Zustand auch haben muss. Davon ab ist das aber auch nicht so toll, wenn die Zustände unterschiedlich je Bus sind.

Beta-Users feedback bzgl. der Filterfunktion war aber ganz gut. Das geht zwar nicht direkt mit einem Filter im set, aber ich habs nun wie nachfolgend gelöst. Da wird dann zwar immer noch 3x das Notify aufgerufen, aber trotzdem nur einmal geschaltet. Ist zwar länger als das über ReadingsSingleUpdate zu machen, aber gefühlt sauberer, wenn man keine Funktionen zweckentfremdet


define Wohnen.Klima.Notify (KNX.Wohnen.Klima|Wohnen.Klima):\s?(on|off) {
  Log3 $NAME, 4, "Wohnen.Klima.Notify called (name: $NAME - event: $EVENT - value: ".Value($NAME).")";

  if ($NAME eq "KNX.Wohnen.Klima") {
    Log3 $NAME, 4, "Wohnen.Klima.Notify: schalte Wohnen.Klima (Value: ".Value("Wohnen.Klima").")";
    fhem "set Wohnen.Klima $EVENT";
  } else {
    if (Value("KNX.Wohnen.Klima") ne $EVENT) {
      Log3 $NAME, 4, "Wohnen.Klima.Notify: schalte KNX.Wohnen.Klima (Value: ".Value("KNX.Wohnen.Klima").")";
      fhem "set KNX.Wohnen.Klima $EVENT"
    }
  }
}

Beta-User

...jetzt gibt man sich so Mühe, eine Schreibweise zu verwenden, die NOTIFYDEF setzt, und dann wird es so verhunzt :o ::) ...

Und warum wollen alle unbedingt immer interpolieren? Einfache Quotes würden es doch hier (abgesehen von den Log3-Anweisungen) auch durchgängig tun (und warum man bei nicht-built-in Funktionen keine Klammern setzt, werde ich in diesem Leben vermutlich auch nicht mehr verstehen). Und Value(), na ja, ich mag es überhaupt nicht... Ist so "Wischi-Waschi"...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Guybrush

Die DoubleQuotes sind ja erstmal nicht schädlich und wären auch nur bei den if / Value anzupassen. Grundlegend verwende ich einfache Quotes immer nur dann, wenn ich nicht möchte, dass da Variablen ersetzt werden etc. Ist ja hier nun kein HPC, wo es um jede nanosekunde geht  ;D

Was ist denn mit Value? Dachte das ist genau dafür oder ist das ein Relikt aus alten Versionen bzw. depricated? Man kanns auch über ReadingsVal machen, aber Value() ist da viel trivialer  und macht unterm Strich doch das gleiche?

Beta-User

Mein Hauptaufreger war NOTIFYDEF...

Der Rest nur "Zugabe"...
Zitat von: Guybrush am 19 Juli 2022, 13:23:31
Die DoubleQuotes sind ja erstmal nicht schädlich und wären auch nur bei den if / Value anzupassen. Grundlegend verwende ich einfache Quotes immer nur dann, wenn ich nicht möchte, dass da Variablen ersetzt werden etc. Ist ja hier nun kein HPC, wo es um jede nanosekunde geht  ;D
Der Punkt ist: Warum dreht man hier nicht allgemein die gedankliche Logik um und verwendet per default einfache Quotes und DoubleQuotes eben nur dann, wenn man wirklich interpolieren will...? Es gibt im ganzen FHEM-Code gefühlte 10.000 Tonnen von doppelten Quotes, die keiner braucht... Dafür finden sich dazu noch Myriaden von expliziten concatenations, die man bequem mit in den doppelten Quotes davor und danach unterbringen könnte. Irgendwann sollte man diese Art Kopierfehler einfach sein lassen, just my 2 ct.

Zitat
Was ist denn mit Value? Dachte das ist genau dafür oder ist das ein Relikt aus alten Versionen bzw. depricated? Man kanns auch über ReadingsVal machen, aber Value() ist da viel trivialer  und macht unterm Strich doch das gleiche?
Wenn man genau weiß, dass man damit eigentlich eine InternalVal-Abfrage macht, ist alles gut. Das Problem ist: Den wenigsten ist das bewußt, und immer mal wieder taucht einer auf, dem eine stateFormat-Anweisung "komisch" auf die Füße fällt.

Warum funktioniert eigentlich mein FILTER-Vorschlag nicht direkt? Ich kann das Problem auf die Schnelle nicht erkennen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

erwin

Hi,
du hast uns bisher noch nicht die list's der betroffenen devices gezeigt, darum muss ich etwas raten  :D
Ich interpretiere so:
1) Du hat einen KNX-Taster (mit LED) der brav seine Aktion an FHEM meldet.
2) Du hat ein NICHT KNX-device, dass mit diesem Taster ein/aus geschaltet wird.
.. und bis hierher funktioniert auch alles

zum KNX Taster: üblicherweise haben diese Taster mehrere Objekte, die auf GA's gemappt werden können (mittels ETS)
bei mir schaut das z.b. so aus:
obj.x = tastendruck kurz -> GA 1/1/1:dpt1 - in der ETS als toggle definiert
obj.y = status                 -> GA 1/1/2:dpt1 - wird im Taster intern für die "toggle" Funktion benötigt
obj.z = led                      -> GA 1/1/3:dpt1 - Led on/off
oder als def:
define <knx-device> KNX 1/1/1:dpt1:taster 1/1/2:status:get:nosuffix 1/1/3:led:set:nosuffix

Fall jetzt vom nicht KNX-Gerät der status (on/off) event kommt, macht das notify (nur auf das nicht-KNX-Gerät triggern!)

set <knx-device> status $EVTPART1
  set <knx-device> led $EVTPART1

und alles wird gut....(ausser ich hab falsch geraten  ;D )
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Guybrush

der Filtervorschlag sähe ja so aus oder?


define Wohnen.Klima.Notify notify (KNX.Wohnen.Klima|Wohnen.Klima):\s?(on|off) set FILTER=state!=$EVENT $EVENT


das Problem da ist, dass ich bei einem Event von Wohnen.Klima den State von KNX.Wohnen.Klima bräuchte und vice versa. Mir ist jedenfalls nicht bekannt, dass man das über die Filterfunktion so direkt lösen könnte

was meinst du mit NOTIFYDEF? Steh da grad auf dem Schlauch

Beta-User

Ich wäre mit deinen Device-Bezeichnungen auf das hier gekommen:

define Wohnen.Klima.Notify notify KNX.Wohnen.Klima:o[nf]+|Wohnen.Klima:o[nf]+ set (KNX.Wohnen.Klima|Wohnen.Klima):FILTER=state!=$EVENT $EVENT



Zitat von: Guybrush am 19 Juli 2022, 13:41:04
das Problem da ist, dass ich bei einem Event von Wohnen.Klima den State von KNX.Wohnen.Klima bräuchte und vice versa. Mir ist jedenfalls nicht bekannt, dass man das über die Filterfunktion so direkt lösen könnte
Wieso? Du setzt einfach das andere Device auf den "Status" vom triggernden Device und gut ist...

Zitat
was meinst du mit NOTIFYDEF? Steh da grad auf dem Schlauch
Wenn du meine Definition übernimmst, solltest du (ggf. nach einem Browser-Refresh) den Unterschied in den Internals sehen ;) .

Zu den Details, auch was Performance angeht siehe auch (Kurzfassung): https://forum.fhem.de/index.php/topic,116701.0.html, und (Langform) Grundsätzliche Codingfragen / Performance: https://forum.fhem.de/index.php/topic,117075.0.html
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors