[gelöst] Ventilator mit 3 Stufen per alexa schalten

Begonnen von LutzG, 19 Juni 2022, 21:02:02

Vorheriges Thema - Nächstes Thema

LutzG

Hallo, ich finde nicht die richtigen Stichwörter, wie ich alexa sage, Ventilator: Aus / An (Stufe 1) / Stufe 2 / Stufe 3.

Es geht um 2 Westinghouse Deckenventilatoren und 1 Standventilator, mit IR-Fernbedienung. Die sollen später mal mit 2 auvisio Infrarot Fernbedienungen (mit Tasmota_ir geflascht) bedient werden. Was ich mir bis jetzt zusammen gesucht habe, funktioniert in fhem, aber alexa bekomme ich nicht überredet, da mit zu spielen. Als genericDeviceType habe ich schon: blind, light, fan probiert. Und für jeden Zustand ein extra Dummy, fände ich nicht so prickelnd / unübersichtlich.

Mein Problem: In der Alexa-App kann ich "an / aus" schalten -> kommt in fhem an, aber nach ein paar Sekunden springt die Anzeige zurück auf den Wert, wie "pct" eingestellt ist. Ist pct = 0 kann ich einschalten, geht aber immer wieder aus, ist pct > 0 geht die Anzeige immer wieder an. Für die Stufen wollte ich "pct" auswerten und bei größer/kleiner 33 / 66 / 99 % entsprechend senden.

Das Device:

defmod WZ_Deckenventilator dummy
attr WZ_Deckenventilator DbLogExclude .*
attr WZ_Deckenventilator alexaName Deckenventilator
attr WZ_Deckenventilator alexaRoom Wohnzimmer
attr WZ_Deckenventilator comment https://forum.fhem.de/index.php/topic,53282.msg1044917.html#msg1044917\
https://forum.fhem.de/index.php/topic,103442.msg1083748.html#msg1083748
attr WZ_Deckenventilator devStateIcon off:vent_ventilation on:vent_ventilation_level_1 2:vent_ventilation_level_2 3:vent_ventilation_level_3
attr WZ_Deckenventilator event-on-change-reading .*
attr WZ_Deckenventilator genericDeviceType fan
attr WZ_Deckenventilator readingList pct
attr WZ_Deckenventilator room Test
attr WZ_Deckenventilator setList pct:slider,0,1,100 state:off,on,2,3
attr WZ_Deckenventilator webCmd state

setstate WZ_Deckenventilator off
setstate WZ_Deckenventilator 2022-06-19 19:57:43 pct 35
setstate WZ_Deckenventilator 2022-06-19 19:57:23 state off


Vielen Dank schon Mal,

Lutz
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

locodriver

Ich habe das mit einem Dummy realisiert, der bei Alexa als Thermostat auftaucht.

Die Bedienung lauft über: "Alexa, stelle den Ventilator auf 0 (1,2,3)"; die Antwort kommt als: "Thermostat auf 0 (1,2,3) gestellt."

Ein DOIF reagiert auf den Dummy und steuert den IR-Blaster an...

Internals:
   CFGFN      ./FHEM/061_WZ.cfg
   FUUID      60e56b45-f33f-b425-478b-fb051698186436ba
   NAME       WZ_Ventilator
   NR         118
   STATE      Ein
   TYPE       dummy
   READINGS:
     2022-06-19 23:45:13   desired-temp    0
     2022-06-18 16:05:42   state           on
Attributes:
   alexaName  Ventilator
   alexaProactiveEvents 1
   eventMap   on:Ein off:Aus
   genericDeviceType thermostat
   homebridgeMapping On:reading=state,cmdOn=on,cmdOff=off
   readingList desired-temp measured-temp
   room       001Wohnzimmer
   setList    on off desired-temp measured-temp 0 1 2 3


und

Internals:
   DEF        ([WZ_Ventilator:desired-temp] eq 1) (set IR_Blaster send IR_WZ_Ventilator_1)
DOELSEIF
([WZ_Ventilator:desired-temp] eq 2)(set IR_Blaster send IR_WZ_Ventilator_2)
DOELSEIF
([WZ_Ventilator:desired-temp] eq 3) (set IR_Blaster send IR_WZ_Ventilator_3)
DOELSEIF
([WZ_Ventilator:"^off$"] or [WZ_Ventilator:"^Aus$"] or [WZ_Ventilator:desired-temp] eq 0) (set IR_Blaster send IR_WZ_Ventilator_0)
   FUUID      6151d4a2-f33f-b425-dcdc-4dbc4976d6a2a6ac
   MODEL      FHEM
   NAME       WZ_Ventilator_run
   NOTIFYDEV  WZ_Ventilator,global
   NR         927
   NTFY_ORDER 50-WZ_Ventilator_run
   STATE      cmd_4
   TYPE       DOIF
   VERSION    26159 2022-06-19 16:10:29
   READINGS:
     2022-06-19 23:45:13   Device          WZ_Ventilator
     2022-06-19 23:45:13   cmd             4
     2022-06-19 23:45:13   cmd_event       WZ_Ventilator
     2022-06-19 23:45:13   cmd_nr          4
     2022-06-19 23:45:13   e_WZ_Ventilator_desired-temp 0
     2022-06-19 23:45:13   e_WZ_Ventilator_events desired-temp: 0
     2022-05-20 10:46:14   mode            enabled
     2022-06-19 23:45:13   state           cmd_4
   Regex:
     accu:
     collect:
     cond:
       WZ_Ventilator:
         0:
           desired-temp ^WZ_Ventilator$:^desired-temp:
         1:
           desired-temp ^WZ_Ventilator$:^desired-temp:
         2:
           desired-temp ^WZ_Ventilator$:^desired-temp:
         3:
           &STATE     ^WZ_Ventilator$
           desired-temp ^WZ_Ventilator$:^desired-temp:
   condition:
     0          ::ReadingValDoIf($hash,'WZ_Ventilator','desired-temp') eq 1
     1          ::ReadingValDoIf($hash,'WZ_Ventilator','desired-temp') eq 2
     2          ::ReadingValDoIf($hash,'WZ_Ventilator','desired-temp') eq 3
     3          ::EventDoIf('WZ_Ventilator',$hash,'^off$',1) or ::EventDoIf('WZ_Ventilator',$hash,'^Aus$',1) or ::ReadingValDoIf($hash,'WZ_Ventilator','desired-temp') eq 0
   do:
     0:
       0          set IR_Blaster send IR_WZ_Ventilator_1
     1:
       0          set IR_Blaster send IR_WZ_Ventilator_2
     2:
       0          set IR_Blaster send IR_WZ_Ventilator_3
     3:
       0          set IR_Blaster send IR_WZ_Ventilator_0
     4:
   helper:
     NOTIFYDEV  WZ_Ventilator,global
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
   readings:
     all         WZ_Ventilator:desired-temp
   trigger:
     all         WZ_Ventilator
   uiState:
   uiTable:
Attributes:
   devStateIcon cmd_1:vent_ventilation_level_1 cmd_2:vent_ventilation_level_2 cmd_3:vent_ventilation_level_3 cmd_4:vent_ventilation_level_0
   do         always
   icon       vent_ventilation
   room       001Wohnzimmer
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

MadMax-FHEM

Wie im Wiki vermerkt muss man erst mal sehen was Amazon/Alexa alles unterstützt: https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html

Was dort nicht mit Unterstützung in der entsprechenden Sprache auftaucht, kann man nicht nutzen, weil es eben Alexa nicht versteht...
(Ausnahme: eine Routine in Alexa anlegen, dort kann man genau vorgeben was man sagen will. Allerdings unflexibel, weil für jedes Kommando/jede Kommandovariante eine Routine angelegt werden muss, evtl. aber bei den 2-3 Befehlen eine gute Alternative ;)  Man kann auch z.B. verschiedene pct bei einem "Licht-dummy" am Ende der Routine angeben und so per notify/DOIF dann die tatsächlichen Schaltbefehle absetzen. Nachteil: die Anzeige ist nat. dann in der Alexa-App nicht möglich und Steuerung über die App auch nur schwierig, man muss ja den jeweiligen pct Wert "treffen" / weitere Alternative: Custom Skill)

Da z.B. genericDeviceType nicht nur von alexa-fhem sondern auch von gassistant und homekit (soweit ich weiß oder homebridge oder welches Apfelzeugs auch immer ;)  ) und ebenso homebridgeMapping geht nicht alles/jeder einstellbare Wert mit allen Steuerungen...

Daher muss man erst mal was raussuchen, was dem was man will am nächsten kommt...
...und dann einfach mal mittels setzen von genericDeviceType probieren.

Wird es nicht autom. erkannt oder passen Werte/Befehle nicht -> homebridgeMapping

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)

LutzG

@locodriver
Vielen Dank für deinen Vorschlag! Hat aber leider (bei mir) ähnliche Symptome wie mein Versuch. Per Sprache funktioniert das (bei mir auch mit ein/aus), in der Alexa-App kann ich aber den Ventilator nicht richtig bedienen.

@Joachim
Zitat...und dann einfach mal mittels setzen von genericDeviceType probieren.
Das probiere ich schon eine Weile, ohne eine zufriedenstellende Lösung. Ich habe aber gerade was von dir und @friesenjung gefunden:
https://forum.fhem.de/index.php/topic,104130.msg1119070.html#msg1119070
Per Sprache: an/aus/Stufe0-3 funktioniert schon mal, in der Alexa-App funktioniert: aus / Stufe1-3, nur "ein" schaltet noch nicht auf Stufe 1 und bringt den Ein/aus Schalter durcheinander.

Zitat von: friesenjung am 07 Januar 2021, 15:55:24
defmod Test_Alexa DOIF ([$SELF:Stufe]>0)
attr Test_Alexa DbLogExclude .*
attr Test_Alexa alexaName Lüftung
attr Test_Alexa alias Test_Alexa
attr Test_Alexa cmdState on|off
attr Test_Alexa comment https://forum.fhem.de/index.php/topic,104130.msg1119070.html#msg1119070
attr Test_Alexa event-on-change-reading .*
attr Test_Alexa genericDeviceType switch
attr Test_Alexa homebridgeMapping Brightness=Stufe,cmd=Stufe,minValue=0,maxValue=3 On:cmdOn=Stufe+1,cmdOff=Stufe+0
attr Test_Alexa readingList Stufe
attr Test_Alexa room Test
attr Test_Alexa setList on off Stufe:slider,0,1,3

setstate Test_Alexa off
setstate Test_Alexa 2022-06-22 02:13:42 Stufe 0
setstate Test_Alexa 2022-06-22 02:13:42 cmd 2
setstate Test_Alexa 2022-06-22 02:13:42 cmd_event Test_Alexa
setstate Test_Alexa 2022-06-22 02:13:42 cmd_nr 2
setstate Test_Alexa 2022-06-22 02:13:42 e_Test_Alexa_Stufe 0
setstate Test_Alexa 2022-06-22 01:38:13 mode enabled
setstate Test_Alexa 2022-06-22 02:13:42 state off

Das homebridgeMapping hab ich etwas geändert, von "On:cmdOn=on" auf "On:cmdOn=Stufe+1". Scheint aber noch nicht zu stimmen!?

Klingt erst Mal sehr vielversprechend - nur 1 Device, kein dummy+doif. Ich hoffe, morgen komme ich zum weiter spielen.  :)
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

MadMax-FHEM

#4
Zitat von: LutzG am 22 Juni 2022, 02:37:00
Zitat

    ...und dann einfach mal mittels setzen von genericDeviceType probieren.

@JoachimDas probiere ich schon eine Weile, ohne eine zufriedenstellende Lösung.

Das hast du aber (auch) beachtet:
Zitat
Wie im Wiki vermerkt muss man erst mal sehen was Amazon/Alexa alles unterstützt: https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html

Weil damit fängt alles an ;-)

Zitat
Per Sprache: an/aus/Stufe0-3 funktioniert schon mal, in der Alexa-App funktioniert: aus / Stufe1-3, nur "ein" schaltet noch nicht auf Stufe 1 und bringt den Ein/aus Schalter durcheinander.
Evtl. auch value=... im homebridgeMapping setzen...

EDIT: wenn etwas nicht geht, dann mal im alexa-fhem Log schauen. Da steht drin was von Amazon kommt und was alexa-fhem (anhand von Automatik oder per homebridgeMapping angepasst) draus macht...

Aber so tief stecke ich da nicht drin und: ich nutze Sprache nur für "simple Dinge"...
Alles andere ist mir zu kompliziert und (leider) auch "fehleranfällig" (also bzgl. was versteht Alexa und/bzw. was macht sie draus)...

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)

TomLee

#5
Vorausgesetzt die mit Tasmota_ir geflashten FBs werden am Ende mit MQTT2 in FHEM eingebunden, hätte ich folgenden Vorschlag es direkt im MQTT2_DEVICE umzusetzen.

Mithilfe eines pct-setter kannst du mit deinem gewünschten Sprachbefehl
Alexa, <alexaName> auf Stufe <1-3>
die Stufen schalten, klappt bei mir einwandfrei.

pct:{'slider,1,1,'.scalar(split(/,/,ReadingsVal($name,'codes','none'))).',1'} {my @d = split(/,/,ReadingsVal($NAME,'codes','none'));my ($i,%pct2cmd);map {$i++;$pct2cmd{$i} = $_;} (@d);my $cmd = $pct2cmd{$EVTPART1};return if !$cmd;fhem("setreading $NAME pct $EVTPART1");return qq(cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": $cmd});}

Die drei IR-Codes der Stufen musst du dazu einfach mit setreading in ein Reading schreiben, kommagetrennt (oder sonstigen Trenner, dann halt den Code anpassen).

Ein Beispieldevice nur zum nachvollziehen (da sind nicht alle Readings vorhanden weil das eine Kopie meines Devices ist und bis jetzt kein restart stattfand):
defmod MQTT2_Demo MQTT2_DEVICE DVES_104A25
attr MQTT2_Demo IODev MQTT2_Server
attr MQTT2_Demo alexaName mairübe
attr MQTT2_Demo devicetopic tasmotairwz
attr MQTT2_Demo icon IR
attr MQTT2_Demo readingList tele/tasmotairwz/LWT:.* LWT\
tele/tasmotairwz/STATE:.* { json2nameValue($EVENT) }\
tele/tasmotairwz/SENSOR:.* { json2nameValue($EVENT) }\
tele/tasmotairwz/INFO.:.* { json2nameValue($EVENT) }\
stat/tasmotairwz/RESULT:.* {}\
attr MQTT2_Demo room MQTT2_DEVICE
attr MQTT2_Demo setList irsend:textField cmnd/tasmotairwz/IRSend {"protocol": "NEC", "bits": 32, "data": $EVTPART0}\
pct:{'slider,1,1,'.scalar(split(/,/,ReadingsVal($name,'codes','none'))).',1'} {my @d = split(/,/,ReadingsVal($NAME,'codes','none'));;my ($i,%pct2cmd);;map {$i++;;$pct2cmd{$i} = $_;;} (@d);;my $cmd = $pct2cmd{$EVTPART1};;return if !$cmd;;fhem("setreading $NAME pct $EVTPART1");;return qq(cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": $cmd});;}

setstate MQTT2_Demo pct
setstate MQTT2_Demo 2022-06-22 11:40:48 IODev MQTT2_Server
setstate MQTT2_Demo 2022-06-22 11:48:37 codes 551489775,0x00FF40BF,0x00FF00FF
setstate MQTT2_Demo 2022-06-22 13:18:32 pct 2
setstate MQTT2_Demo 2022-06-22 13:18:32 state pct
setstate MQTT2_Demo 2022-06-22 12:47:59 subscriptions cmnd/DVES_104A25_fb/# cmnd/sonoffs/# cmnd/tasmotairwz/#


edit:

Die IR-Codes der Stufen ohne setreading ergänzen, aktualisieren:

attr MQTT2_Demo setList codes:{'multiple,'.ReadingsVal($name,'codes','none');;} {sleep 0.5;;fhem("setreading $NAME $EVTPART0 $EVTPART1")}

Dabei fällt mir auf das es wohl besser ist ein sleep im pct-setter zu ergänzen:

Zitatattr MQTT2_Demo setList pct:{'slider,1,1,'.scalar(split(/,/,ReadingsVal($name,'codes','none'))).',1'} {my @d = split(/,/,ReadingsVal($NAME,'codes','none'));;my ($i,%pct2cmd);;map {$i++;;$pct2cmd{$i} = $_;;} (@d);;my $cmd = $pct2cmd{$EVTPART1};;return if !$cmd;;sleep 0.5;;fhem("setreading $NAME pct $EVTPART1");;return qq(cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": $cmd});;}


nochmal edit, weil Erinnerungen hochkamen und ich Lust und Zeit hatte mich mit zu beschäftigen:

Unabhängig davon ob der Code ausgelagert werden sollte, bevor sich wer "beschwert" dass das mit dem map schwerer zu lesen wäre,  kann man das auch mit einer for-Schleife angehen und wer sich fragt warum wozu scalar, ich weiß es nicht mehr,  man kanns auch weglassen.

attr MQTT2_Demo setList pct:{'slider,1,1,'.scalar(split(/,/,ReadingsVal($name,'codes','none'))).',1'} {my @d = split(/,/,ReadingsVal($NAME,'codes','none'));;my ($i,%pct2cmd);; for my $v (@d) {$i++;;$pct2cmd{$i} = $v;;}my $cmd = $pct2cmd{$EVTPART1};;return if !$cmd;;sleep 0.5;;fhem("setreading $NAME pct $EVTPART1");;return qq(cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": $cmd});;}

justme1968

mehrere stufen lassen sich mit alexa z.b. hiermit: https://forum.fhem.de/index.php/topic,125604.msg1202199.html#msg1202199 umsetzen. je nach gewünschten kommandos eventuell in kombination mit alexa routinen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

LutzG

Ja, deswegen habe ich gefragt! Auf eure Lösungen wäre ich nie gekommen!  8)

Zitat von: MadMax-FHEM am 22 Juni 2022, 09:44:50
Das hast du aber (auch) beachtet:
Weil damit fängt alles an ;-)
Evtl. auch value=... im homebridgeMapping setzen...
Ich habe neben dem Forum, Wiki, Google, auf der Amazon Seite und auf:
https://wiki.fhem.de/wiki/Attribut_genericDeviceType und
https://wiki.fhem.de/wiki/Alexa_und_Mappings#Liste_der_unterst.C3.BCtzten_Characteristics_und_ihrer_Parameter
versucht schlau zu werden, was Alexa vesteht. Auf eure Lösungen bin ich dabei nicht gekommen.  :(

Mit "value=... " hab ich noch nicht weiter probiert. Ich hab versucht den Vorschlag von @TomLee zu verstehen.

@TomLee
Klingt sehr interessant! Ich hätte dazu aber noch gerne ein paar Fragen:   ::)
Eine "Tasmota_ir geflashter FB" soll für mehrere Geräte (Lüfter, TV, Reciver,...) verwendet werden. Wenn ich für alle ein eigenes MQTT2_Device anlege, werden immer wieder die gleichen Readings von der "FB" abgefragt. Ist das nicht doppelt gemoppelt, oder muss das so?

Was macht "scalar"? Was ich darüber finde verstehe ich nicht. Zählt (bei deinem Code) die Funktion die Dimensionen vom Array?

Ich finde das mit dem "codes"- Reading nicht so schick, bekomme aber "codes" als userattr angelegt, nicht mit: "ReadingsVal($name,'codes','none')" gelesen / verarbeitet. Ich habe aber auch noch nicht soooo lange gesucht.

@justme1968
Super interessant! genericDeviceType "mode", hab ich auch noch nicht für voll genommen.  :o

Ich übe Mal die nächste Zeit. Vielen Dank für eure Vorschläge! :D
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

MadMax-FHEM

Attributabfrage: AttrVal ;)

ReadungsVal und ReadingsNum für Readings...

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)

TomLee

ZitatEine "Tasmota_ir geflashter FB" soll für mehrere Geräte (Lüfter, TV, Reciver,...) verwendet werden. Wenn ich für alle ein eigenes MQTT2_Device anlege, werden immer wieder die gleichen Readings von der "FB" abgefragt. Ist das nicht doppelt gemoppelt, oder muss das so?

Wenn du den Weg über mehrere MQTT2_Devices gehst, darfst in den weiteren Devices halt nicht alle Topics in der ReadingsList "abonnieren", einfach die Zweige (in den weiteren Devices) die du für doppelt gemoppelt hältst weglassen.

ZitatWas macht "scalar"? Was ich darüber finde verstehe ich nicht. Zählt (bei deinem Code) die Funktion die Dimensionen vom Array?

Wie gesagt weiß ich nicht mehr was mich dazu getrieben hatte scalar zu verwenden, split gibt die Anzahl der Elemente zurück und das ist wie ich es bis jetzt verstanden habe ja eh ein Skalar.

Verstehs auch nicht wenn ich mir die Beschreibung dazu übersetze.




Zum Verständnis:

Ich hatte bei meinem Vorschlag nur den Lüfter (alexaName Lüfter) im Kopf, dazu hätte ich noch zwei setter (on und off) ergänzt.
Beispiel:
on:NoArg cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": 0x00FF40BF}
off:noArg cmnd/tasmotairwz/IRSend {"protocol": "NEC","bits": 32, "data": 0x00FF40BF}


(Die IR-Codes könnte man auch aus einem Reading oder Attribut lesen)

Damit wären dann die  Sprachbefehle möglich:
ZitatAlexa, schalte Lüfter an/aus
und
ZitatAlexa, Lüfter auf Stufe 2/3
, natürlich auch
ZitatAlexa, Lüfter auf Stufe 1

Sollten weitere Geräte in diesem Device folgen, war mein Gedanke, diese dann über den pct-setter iVm. dem im code-Reading (oder Attribut) hinterlegten Ir-Code zu ergänzen (pct >=4).
Nachteil, für jeden pct-Wert dann aber eine Routine erstellen, was dann der Vorteil mehrerer MQTT2-Devices wäre und wsl. auch sinnvoll.

Beta-User

Zitat von: TomLee am 24 Juni 2022, 12:01:18
split gibt die Anzahl der Elemente zurück und das ist wie ich es bis jetzt verstanden habe ja eh ein Skalar.
Mißverständnis:
"split" gibt ein Array zurück! Mit dem "scalar" weist du Perl explizit an, die Zahl der in dem Array enthaltenen Elemente zu verwenden, meistens kann man das weglassen, weil Perl das auch so korrekt interpretiert.

In dem unverstandenen Beispiel
my @counts = ( scalar @a, scalar @b, scalar @c );
braucht man das explizite scalar aber, weil sonst in @counts keine Zahlen landen würden, sondern ein neues Array mit allen Elementen der aufgenommenen Arrays gebildet würde.

Hoffe, das ist jetzt etwas klarer?
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

TomLee

Nee, nicht Missverständnis, nur nicht richtig ausgedrückt.

ZitatHoffe, das ist jetzt etwas klarer?

Ja, danke.

TomLee

OT

Jetzt nach kurzer Zeit grübeln, nach der Erläuterung zu scalar, kommt mir mein ich warum ich scalar verwendet hab wieder.

Einfach weil ich damals zu der Erkenntnis kam es sei korrekter es zu verwenden. Hatte hier im Forum irgendwo (in einem anderen Kontext) diesbezüglich auch nachgefragt ob es nicht besser wäre scalar zu verwenden, aber keine Antwort erhalten.

LutzG

Ich würde sagen, der Gewinner ist der Vorschlag von  @Joachim + @friesenjung.  :) Den Code verstehe (vielleicht nicht nur) ich einigermaßen. Per Sprache funktioniert alles, in fhem auch:
defmod Test_Alexa DOIF ([$SELF:Stufe]==0)\
  (set MQTT2_DVES_939567 irsend "NEC" 32 00FF0000)\
DOELSEIF ([$SELF:Stufe]==1)\
  (set MQTT2_DVES_939567 irsend "NEC" 32 00FF1111)\
DOELSEIF ([$SELF:Stufe]==2)\
  (set MQTT2_DVES_939567 irsend "NEC" 32 00FF2222)\
DOELSEIF ([$SELF:Stufe]==3)\
  (set MQTT2_DVES_939567 irsend "NEC" 32 00FF3333)\

attr Test_Alexa DbLogExclude .*
attr Test_Alexa alexaName Lüftung
attr Test_Alexa alias Test_Alexa
attr Test_Alexa cmdState on|off
attr Test_Alexa comment https://forum.fhem.de/index.php/topic,104130.msg1119070.html#msg1119070
attr Test_Alexa devStateIcon 0:vent_ventilation 1:vent_ventilation_level_1 2:vent_ventilation_level_2 3:vent_ventilation_level_3
attr Test_Alexa event-on-change-reading .*
attr Test_Alexa genericDeviceType switch
attr Test_Alexa homebridgeMapping Brightness=Stufe,cmd=Stufe,minValue=0,maxValue=3 On:cmdOn=Stufe+1,cmdOff=Stufe+0
attr Test_Alexa readingList Stufe
attr Test_Alexa room Test
attr Test_Alexa setList off on Stufe:slider,0,1,3
attr Test_Alexa stateFormat Stufe
attr Test_Alexa webCmd Stufe

setstate Test_Alexa 3
setstate Test_Alexa 2022-06-26 20:17:36 Stufe 3
setstate Test_Alexa 2022-06-26 20:17:36 cmd 4
setstate Test_Alexa 2022-06-26 20:17:36 cmd_event Test_Alexa
setstate Test_Alexa 2022-06-26 20:17:36 cmd_nr 4
setstate Test_Alexa 2022-06-26 20:17:36 e_Test_Alexa_Stufe 3
setstate Test_Alexa 2022-06-26 19:26:13 mode enabled
setstate Test_Alexa 2022-06-26 20:17:36 state cmd_4


Nur warum das Doif die Stufe 1 als "aus" und die anderen Stufen (0,2,3) als "an" interpretiert, habe ich leider noch nicht herraus gefunden. Damit funktioniert die Alexa-App nicht richtig. Ich hoffe, ihr habt noch einen Tipp für mich?  ::)

Das MQTT2-Device hab ich einigermaßen hin bekommen (an/aus/Stufe 1-4), nur nicht den Code ummodeln, das pct bei 0 anfängt. Per Sprache funktioniert auch alles, aber in der Alexa-App ist das gleiche Problem, was ich im ersten Post hatte, wenn pct nicht "0" ist, geht in der Alexa-App der Ein/Aus-Schalter immer wieder an:

defmod MQTT2_Demo_Ventilator MQTT2_DEVICE DVES_104A25
attr MQTT2_Demo_Ventilator userattr codes
attr MQTT2_Demo_Ventilator DbLogExclude .*
attr MQTT2_Demo_Ventilator IODev mqtt2server
attr MQTT2_Demo_Ventilator alexaName mairübe
attr MQTT2_Demo_Ventilator codes 0x00FF0ABF,0x00FF1ABF,0x00FF2CFF,0x00FF3DBF
attr MQTT2_Demo_Ventilator devicetopic DVES_468482
attr MQTT2_Demo_Ventilator event-on-change-reading .*
attr MQTT2_Demo_Ventilator icon IR
attr MQTT2_Demo_Ventilator readingList tele/tasmota_468482/LWT:.* LWT\
tele/tasmota_468482/STATE:.* { json2nameValue($EVENT) }\
tele/tasmota_468482/SENSOR:.* { json2nameValue($EVENT) }\
tele/tasmota_468482/INFO.:.* { json2nameValue($EVENT) }\
stat/tasmota_468482/RESULT:.* { json2nameValue($EVENT) }
attr MQTT2_Demo_Ventilator room Test
attr MQTT2_Demo_Ventilator setList off:noArg cmnd/tasmota_468482/IRSend {"protocol": "NEC","bits": 32, "data": 0x00FF50BF}\
  on:noArg cmnd/tasmota_468482/IRSend {"protocol": "NEC","bits": 32, "data": 0x00FF60BF}\
  irsend:textField cmnd/tasmota_468482/IRSend {"protocol":"NEC","bits": 32,"data": $EVTPART1}\
  pct:{'slider,0,1,'.scalar(split(/,/,AttrVal($name,'codes','none'))).',0'} {my @d = split(/,/,AttrVal($NAME,'codes','none'));;my ($i,%pct2cmd);;map {$i++;;$pct2cmd{$i} = $_;;} (@d);;my $cmd = $pct2cmd{$EVTPART1};;return if !$cmd;;fhem("setreading $NAME pct $EVTPART1");;return qq(cmnd/tasmota_468482/IRSend {"protocol":"NEC","bits":32,"data":$cmd});;}
attr MQTT2_Demo_Ventilator verbose 5

setstate MQTT2_Demo_Ventilator pct
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Heap 27
setstate MQTT2_Demo_Ventilator 2022-06-26 19:42:31 IODev mqtt2server
setstate MQTT2_Demo_Ventilator 2022-06-24 00:21:45 IRSend Invalid JSON
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info1_FallbackTopic cmnd/DVES_468482_fb/
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info1_GroupTopic cmnd/tasmotas/
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info1_Module NX-4519-675
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info1_Version 12.0.2(ir)
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info2_Hostname tasmota-468482-1154
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info2_IPAddress 192.168.XXX.XXX
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info2_WebServerMode Admin
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info3_BootCount 20
setstate MQTT2_Demo_Ventilator 2022-06-23 23:53:41 Info3_RestartReason Software/System restart
setstate MQTT2_Demo_Ventilator 2022-06-24 02:58:13 LWT Offline
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 LoadAvg 19
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 MqttCount 1
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Sleep 50
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 SleepMode Dynamic
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Time 2022-06-24T01:53:45
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Uptime 0T03:00:11
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 UptimeSec 10811
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Vcc 3.533
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_AP 1
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_BSSId XX:XX:XX:XX:4F:39
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_Channel 6
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_Downtime 0T00:00:05
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_LinkCount 1
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_Mode 11n
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_RSSI 86
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_SSId XXXXXXX
setstate MQTT2_Demo_Ventilator 2022-06-24 02:53:45 Wifi_Signal -57
setstate MQTT2_Demo_Ventilator 2022-06-26 17:26:06 pct 4
setstate MQTT2_Demo_Ventilator 2022-06-26 17:26:06 state pct


Nicht wundern, das Tasmota_ir-Device (MQTT2_DVES_939567) ist aus. Ich habe im MQTT-Explorer verfolgt, was gesendet werden würde.

Also ich finde, es ist schon sehr viel Licht im Tunnel! Das Ende ist bestimmt bald erreicht! 8)
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

TomLee

 
ZitatPer Sprache funktioniert auch alles ...

Dann ist doch alles gut, die App hab ich bewusst ignoriert, machs wie ich, einfach nicht öffnen.

Denke es liegt daran das alles was >= pct 1 ist als als auf (bei Rollläden) / an (bei Licht) interpretiert wird, also hilft  gdDt blind/light nix, wie man das jetzt Alexa auf einfachstem Weg beibringt nicht zu tun weiß ich auch nicht.
Aber was interessiert dich der Status in der App, der ist selbst in FHEMWEB nur "Verdacht", es gibt doch eh keine Rückmeldung von dem Lüfter ?