Klick auf Icon mit notify verbinden

Begonnen von Adrian08642, 15 Januar 2022, 21:35:04

Vorheriges Thema - Nächstes Thema

Adrian08642

Hallo zusammen,

ich habe schon viele Sache ausprobiert aber sich schaffe es nicht wenn ich auf das Lampen-Icon klicke ein notify auszuführen. Wichtig ich will nur nach dem Klick das notify aktivieren nicht der Zustand selbst.

Getestet habe ich es mit eventMap dort schaffe ich ein klickbares Icon aber kein Ausführen des notify bei "eventMap on:on:an_aus off:off:an_aus" bei "eventMap on:an_aus off:an_aus" schaltet das Licht durch den zustand durchgängig.

Vll kann mir hier jemand sagen was ich falsch mache, bzw. einen anderen Lösungsweg zeigen.

Gruß Adrian


Anbei noch der Code:

define Deckenlicht_Linda dummy
setuuid Deckenlicht_Linda 5cac6383-f33f-f8e2-4d94-5e7a7a33600728ed
attr Deckenlicht_Linda devStateIcon on:FS20.on off:FS20.off an_aus:fts_shutter_1w_0
attr Deckenlicht_Linda eventMap on:on:an_aus off:off:an_aus
attr Deckenlicht_Linda room Linda
attr Deckenlicht_Linda webCmd an_aus
define an_aus_Deckenlicht_Linda notify Deckenlicht_Linda:an_aus set myI2C writeByte 5 1;; Sleep 0.5;; set myI2C writeByte 5 0


define a_I2C_0x05 at +*00:00:02 {my $val = fhem("get myI2C read 5");;\
$val = substr($val,10,length($val)-29);;\
my $wert32 = ($val & 32) > 0 ? "on":"off";;\
my $wert16 = ($val & 16) > 0 ? "on":"off";;\
my $wert8 = ($val & 8) > 0 ? "on":"off";;\
my $wert4 = ($val & 4) > 0 ? "on":"off";;\
my $wert2 = ($val & 2) > 0 ? "on":"off";;\
my $wert1 = ($val & 1) > 0 ? "on":"off";;\
fhem("set Deckenlicht_Linda $wert1");;\
fhem("set Treppenhaus $wert2");;\
fhem("set Deckenlicht_WC $wert4");;\
fhem("set Flur $wert8");;\
fhem("set Garagen_Licht $wert16");;\
fhem("set Wohnzimmerlicht $wert32")}



MadMax-FHEM

#1
Folgender dummy (wenn es unbedingt einer sein muss) als RawDef:


defmod dmDeckenlicht_Linda dummy
attr dmDeckenlicht_Linda room Linda
attr dmDeckenlicht_Linda setList on off


Damit sollte er (sofern einmal geklickt) ein Lampensymbol haben, welches du klicken kannst.

Wenn dich die "WebCommands" stören, du also nur das Icon willst:

attr dmDeckenlicht_Linda webCmd :


Dann den Eventmonitor auf, den dummy klicken, Event wählen und notify anlegen lassen. Anpassen:fertig...
https://wiki.fhem.de/wiki/Event_monitor

Bzw. könnte das notify wie folgt sein:


define n_an_aus_Deckenlicht_Linda notify dmDeckenlicht_Linda:on set myI2C writeByte 5 1;; Sleep 0.5;; set myI2C writeByte 5 0


Oder wenn bei an/aus DASSELBE passieren soll (also kurz hintereinander die beiden Kommandos), dann evtl.:

define n_an_aus_Deckenlicht_Linda notify dmDeckenlicht_Linda:on|dmDeckenlicht_Linda:off set myI2C writeByte 5 1;; Sleep 0.5;; set myI2C writeByte 5 0


Gruß, Joachim
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

Das "dummy-Geschubse" ist immer mit Nebenwirkungen behaftet.

Vielleicht ein etwas anderer Ansatz: Versuche das ganze mal mit readingsProxy zu lösen. Damit sollten die dummy+notify entfallen können, man würde aber eine komplexere Auswertung für die Value-fn benötigen. Das at für die Aktualisierung des "Stammdevices" braucht man aber wohl weiter.
(neulich gab's was ähnliches mit einer Logo-SPS).

Durch die aktuelle Variante erzeugst du vermutlich sehr viel mehr Events als tatsächlich erforderlich sind, da sollte im mindesten Falle noch jeweils eine Prüfung auf Änderung rein.

Ansonsten sieht mir das so aus, als wäre was zwischen eventMap und devStateIcon durcheinandergeraten.
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

Adrian08642

Hallo,

ich glaube ich habe mich zu ungenau ausgedrückt. Ich habe mir eine Steuerung für das Licht selbst gebaut. Über I2C werden Relais angesteuert die das jeweilige Licht schalten. In dem Haus sind Stromstoßrelais und Taster verbaut. Das heißt der gleiche impuls schaltet das Licht ein und auch wieder aus.
Gleichzeitig wird der Strom der Lampe gemessen und damit registriert ob die Lampe angeschalten ist und über I2C dann wieder zurückgemeldet.

Der Dummy ist also mit dem an_aus zum schalten genutzt und das Icon zum anzeigen ob die Lampe an ist.
Ich würde jetzt einfach gerne noch mit dem Icon den gleichen Befehl an_aus triggern.

Ich hoffe es ist jetzt klarer und ich habe euch nicht missverstanden.

Vielen Dank für die Hilfe

Beta-User

#4
Zitat von: Adrian08642 am 17 Januar 2022, 11:00:53
ich glaube ich habe mich zu ungenau ausgedrückt.
Genau von diesem Szenarium war ich ausgegangen, und rund um diesen Beitrag sollten eigentlich ein paar Bausteine zu finden sein, um das ganze jeweils zu einem readingsProxy zusammenzubasteln: https://forum.fhem.de/index.php/topic,124240.msg1190483.html#msg1190483

Wäre nett, wenn es dann wenigstens hier eine Rückmeldung mit der funktionierenden Lösung gäbe ;) .

EDIT: Mal "ins blaue", wie das in etwa aussehen könnte:

defmod rp_Deckenlicht_Linda readingsProxy myI2C:5
attr rp_Deckenlicht_Linda event-on-change-reading state
attr rp_Deckenlicht_Linda timestamp-on-change-reading state
attr rp_Deckenlicht_Linda setFn { fhem('set myI2C writeByte 5 1;; Sleep 0.5;; set myI2C writeByte 5 0')}
attr rp_Deckenlicht_Linda setList on off
attr rp_Deckenlicht_Linda valueFn { my $val = substr($VALUE,10,length($VALUE)-29);; $val & 1 ? 'on':'off' }


Weil das eigentliche Hauptdevice nicht gezeigt ist und vermutlich auch schlecht zu simulieren, habe ich es mit einem dummy getestet, scheint zu funktionieren:
defmod myI2C dummy
setstate myI2C 2022-01-17 11:02:39 5 123456789012345678901234567890123456789
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

Adrian08642

Danke für den Vorschlag ich habe gerade leider nicht die Möglichkeit das auszuprobieren aber ich werde das auf jeden Fall mal testen.

Mit readingProxy habe ich zwar noch nichts gemacht aber wenn das klappt wäre es natürlich super.

Was meinst du damit?
ZitatWeil das eigentliche Hauptdevice nicht gezeigt ist und vermutlich auch schlecht zu simulieren

Beta-User

Zitat von: Adrian08642 am 17 Januar 2022, 14:12:03
Was meinst du damit?
Du hattest kein list von "myI2C" gezeigt. Ich kenne also noch nicht mal den TYPE, obwohl anscheinend praktisch die ganze Kommunikation darüber läuft. Da das FHEM-Device aber vermutlich so oder so Hardware braucht, damit man damit interagieren kann, hätte ich zwar ggf. die Readings gesehen und in der commandref lesen können, welche get-Befehle es gibt bzw. was die denn liefern, aber ob ich daraus schlau geworden wäre, ist eine weitere Frage...
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

Adrian08642

Hallo Beta-User,

ich bin gerade dein Vorschlag zu testen.
ZitatDu hattest kein list von "myI2C" gezeigt.
Da ist nicht mehr viel:
define myI2C RPII2C 1
setuuid myI2C 5c8a7011-f33f-f8e2-bd9c-dd5d275c7abc8195
attr myI2C verbose 5

Der Rest ist auf anderen Microcontroller gelöst. Ich schicke über I2C einfach 6-Bit und jeweils eine 1 heißt die Lampe ist an, 0 aus. Also z.B 000001 wäre das Deckenlicht_Linda ist an und alle anderen sind aus. Ich hoffe das ist klar geworden.

Zu deinem
ZitatMal "ins blaue", wie das in etwa aussehen könnte:
das habe ich getestet und das Licht an und auszuschalten funktioniert tadellos (natürlich kann man mit on auch das licht ausschalten). Ich habe das mal angepasst und es sieht gerade so aus:
define rp_Deckenlicht_Linda readingsProxy myI2C:5
setuuid rp_Deckenlicht_Linda 61ec531c-f33f-3611-387e-3744bd134b175999
attr rp_Deckenlicht_Linda devStateIcon on:FS20.on off:FS20.off
attr rp_Deckenlicht_Linda event-on-change-reading state
attr rp_Deckenlicht_Linda room Linda
attr rp_Deckenlicht_Linda setFn { fhem('set myI2C writeByte 5 1;; Sleep 0.5;; set myI2C writeByte 5 0')}
attr rp_Deckenlicht_Linda setList an_aus
attr rp_Deckenlicht_Linda timestamp-on-change-reading state
attr rp_Deckenlicht_Linda valueFn { my $val = substr($VALUE,10,length($VALUE)-29);; $val & 1 ? 'on':'off' }
attr rp_Deckenlicht_Linda webCmd an_aus


Leider funktioniert die Anzeige ob das Licht an ist nicht. Ich schätze das mit valueFn läuft gerade noch nicht.
Ich weiß solche Ferndiagnosen sind schwierig gerade wenn man kein Einblick in das Gesamtsystem hat, aber hast du vll eine Idee woran es liegen könnte. Leider erinnere ich mir nicht mehr warum ich das Modul  a_I2C_0x05 so geschrieben habe wie es gerade ist.

Vielen Dank für deine Hilfe
Gruß Adrian

ak323

Zitat von: Beta-User am 16 Januar 2022, 09:11:28
Das "dummy-Geschubse" ist immer mit Nebenwirkungen behaftet.

Vielleicht ein etwas anderer Ansatz: Versuche das ganze mal mit readingsProxy zu lösen. Damit sollten die dummy+notify entfallen können, man würde aber eine komplexere Auswertung für die Value-fn benötigen. Das at für die Aktualisierung des "Stammdevices" braucht man aber wohl weiter.
(neulich gab's was ähnliches mit einer Logo-SPS).

lol ... gerade von einem anderen FHEM Guru folgendes gehört:
"im ganzen Leben hab ich noch kein readingsProxy verwendet... extra für Dich..."
https://forum.fhem.de/index.php/topic,65048.msg1202754.html#msg1202754

Good Luck !
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

Beta-User

Zitat von: ak323 am 22 Januar 2022, 20:54:15
lol ... gerade von einem anderen FHEM Guru folgendes gehört:
lol... kommt aber auch immer drauf an, was man so an Hardware rumliegen hat...
(Ganz sicher macht betateilchen aber für sowas auch kein "dummy-Geschubse" (sondern hätte das vermutlich schon auf der Hardware-Seite anders angegangen)...)

Zitat von: Adrian08642 am 22 Januar 2022, 20:32:32
ich bin gerade dein Vorschlag zu testen.  Da ist nicht mehr viel:
define myI2C RPII2C 1
setuuid myI2C 5c8a7011-f33f-f8e2-bd9c-dd5d275c7abc8195
attr myI2C verbose 5

Das ist kein "list", sondern eher ein Indikator, dass du zu den cfg-Editierern gehörst => no-go zone!

Ich will die Readings sehen, und bitte wenn möglich auch Events. Wie es grundsätzlich funktioniert, ist mir schon klar, aber eben nicht, was GENAU zurückkommt bzw. wie der Rücklesevorgang genau aussieht (braucht man das/ein at?)...
Dto. wäre das ggf. für den readingsProxy interessant. define aus der cfg ist "Totholz".

ZitatIch habe das mal angepasst und es sieht gerade so aus:
attr rp_Deckenlicht_Linda setList an_aus
attr rp_Deckenlicht_Linda webCmd an_aus

Dieses an_aus irritiert mich hochgradig. Für was braucht man das? Es ist ein toggle, oder?
Da das genausogut über das devStateIcon ausgelöst wird, wäre mein Ansatz, das ganz wegzulassen:
attr rp_Deckenlicht_Linda setList on off
attr rp_Deckenlicht_Linda webCmd :


ZitatLeider funktioniert die Anzeige ob das Licht an ist nicht. Ich schätze das mit valueFn läuft gerade noch nicht.
Genau. Daher: ein list vom "Gerät in Aktion" bzw. Events von dem, wie der Status zurückkommt (=>Event-Monitor). Dann kann man simulieren, ohne muss ich raten, und das macht keinen großen Spaß...
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

Adrian08642

Also mit get myI2C read 5 bekommt man received : 1  |  transmission: Ok das zurück (die 1 ist für das eingeschaltene Licht (Deckenlicht_Linda).

ZitatDas ist kein "list", sondern eher ein Indikator, dass du zu den cfg-Editierern gehörst => no-go zone!
Nur zur Code rauskopieren.

ZitatDieses an_aus irritiert mich hochgradig. Für was braucht man das? Es ist ein toggle, oder?
Ok dann lassen wir das erstmal bei on off

Zitatwie der Status zurückkommt (=>Event-Monitor)
Das wird dir denke ich nicht helfen weil ja schon die Werte angepasst wurden. Trotzdem die Werte von a_I2C_0x05:
2022-01-22 22:03:28 dummy Deckenlicht_Linda on
2022-01-22 22:03:28 dummy Treppenhaus off
2022-01-22 22:03:28 dummy Deckenlicht_WC off
2022-01-22 22:03:28 dummy Flur off
2022-01-22 22:03:28 dummy Garagen_Licht off
2022-01-22 22:03:28 dummy Wohnzimmerlicht off
2022-01-22 22:03:28 at a_I2C_0x05 Next: 22:03:30


Danke für deine Hilfe :)

Beta-User

#11
Spricht irgendwas dagegen, dass du einfach zeigst, was
list myI2C
liefert?
(Mit dem gezeigten Ergebnis kann ich jetzt zumindest ahnen, wie der Wert codiert wurde).

Vermutlich steht im Reading "5" von myI2C einfach nur (z.B.) eine "1"...?

EDIT:
Dann könnte sowas ausreichen:
attr rp_Deckenlicht_Linda valueFn { $VALUE & 1 ? 'on':'off' }

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

Adrian08642

Tut mir leid ich kenn mich noch nicht so aus...

ZitatSpricht irgendwas dagegen, dass du einfach zeigst, was list myI2C liefert?
Natürlich nicht. ich kannte den Befehl nicht.
Internals:
   DEF        1
   DeviceName /dev/i2c-1
   FUUID      5c8a7011-f33f-f8e2-bd9c-dd5d275c7abc8195
   NAME       myI2C
   NOTIFYDEV  global
   NR         15
   NTFY_ORDER 50-myI2C
   STATE      Ok
   TYPE       RPII2C
   ioctl_ph_exists 1
Attributes:
   verbose    5


Danke für deine Hilfe

Beta-User

OK, überzeugt... Das geht in der Tat mit der Methode readingsProxy nicht...

(Wer denkt sich den sowas aus? Im Prinzip ist es ein reines Interface-Modul...)

Dann bleibt in der Tat nur die Option, das Ding händisch auszulesen, und ggf. dann die Infos zu verteilen. Da das Schalten funktioniert, könntest du (z.B.) ein "setreading <readingsProxy> state on" ausführen, um den ausgelesenen Status jeweils zu übertragen, allerdings würde ich zum einen empfehlen, das nur zu machen, wenn der Status nicht sowieso schon auf dem Zielwert ist, (das ist einfach) und zum anderen könnte man versuchen, das in eine einzige fhem-Anweisung einzupacken (ist aber schwieriger).
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

Adrian08642

Zitat(Wer denkt sich den sowas aus? Im Prinzip ist es ein reines Interface-Modul...)

Ich ;D wenn man keine Ahnung von FHEM hat sondern nur ein bisschen Hardware und C Wissen.

Ok hört sich so an als würde es sich nicht wirklich rentieren, nur damit das dummy und das notify ersetzt wurden.

Ich denke ich gebe das mit dem klickbarem Icon einfach auf, dachte nicht das es so schwierig ist...

Trotzdem danke für deine Mühen :)