tuya-mqtt / Alpha Q13 Pro WiFi - Luftentfeuchter und Anbindung

Begonnen von 87insane, 07 Januar 2022, 11:45:07

Vorheriges Thema - Nächstes Thema

87insane

Hey zusammen,

da ich nun den o.g. Luftentfeuchter habe, habe ich auch gleich angefangen das Gerät an FHEM zu hängen. Dazu habe ich den tuya-mqtt Weg gewählt.
Am liebsten würde ich das Teil einfach auf Tasmota falshen aber ich verstehe noch nicht wirklich die Zusammenhänge mit den IDs von Tuya. Wenn da einer etwas Nachhilfe geben kann, gern :)

Für die Nachwelt, wollte ich wenigstens ein Template da lassen, welches aufzeigt, wie ich tuya-mqtt nutze und ein laufendes Gerät bekomme.

Zuerst habe ich tuya-mqtt eingerichtet und mir eine Bridge in FHEM angelegt. Anbei ein RAW der Bridge. Die Dienste Steuerung ist hier aktiv, da Testsystem.
Kann man auch weg lassen. Wichtig ist hier eigentlich erstmal nur die bridgeRegexp. Da sonst bei jedem Neustart ein neues Gerät angelegt werden würde.
Die online Erkennung ist nicht gut, da sie prüft ob mein Testgerät online ist. Eigentlich sollte man hier besser den Dienst überwachen. Leider liefert dieser kein
online/offline state mit.

RAW: tuya-mqtt Bridge
defmod MQTT2_tuya_bridge MQTT2_DEVICE tuya2mqtt
attr MQTT2_tuya_bridge bridgeRegexp tuya/([A-Za-z0-9._]+)[/]?.*:.* "tuya_$1"
attr MQTT2_tuya_bridge devStateIcon { \
my $amp = ReadingsVal($name,"state","ERROR") eq "online" \
? "gruen" \
: "rot";;\
my $stateinfo = ReadingsVal($name,"state","0") eq "online" \
? "tuya2MQTT läuft!" \
: "tuya2MQTT Dienst ist aus oder kein Gerät online";;\
my $start = "<a href=\"/fhem?cmd.dummy=set $name start_service&XHR=1\">".FW_makeImage("audio_play\@green")."</a>";;\
my $stop = "<a href=\"/fhem?cmd.dummy=set $name stop_service&XHR=1\">".FW_makeImage("audio_stop\@red")."</a>";;\
my $restart = "<a href=\"/fhem?cmd.dummy=set $name restart_service&XHR=1\">".FW_makeImage("audio_repeat\@blue")."</a>";;\
my $show = FW_makeImage("10px-kreis-".$amp);;\
"<div>$start $stop $restart &nbsp;; &nbsp;; &nbsp;; &nbsp;; &nbsp;; $show $stateinfo</div>" \
}
attr MQTT2_tuya_bridge readingList tuya/dehumidifier/status:.* state
attr MQTT2_tuya_bridge room Server
attr MQTT2_tuya_bridge setList start_service:noArg {system ("pm2 start /opt/tuya-mqtt/tuya-mqtt.js --cwd /opt/tuya-mqtt/ --name 'tuya2mqtt'")}\
  restart_service:noArg {system ("pm2 restart -s tuya2mqtt")}\
  stop_service:noArg {system ("pm2 stop tuya2mqtt")}\
  pm2_status:noArg {system ("pm2 status")}

setstate MQTT2_tuya_bridge online
setstate MQTT2_tuya_bridge 2022-01-06 14:11:53 IODev MQTT2_FHEM_Server
setstate MQTT2_tuya_bridge 2022-01-06 10:08:59 state online


Nachdem ich die Bridge angelegt hatte, habe ich autocreate aktiviert und ein neues Gerät erhalten. In diesem mussten tuya üblich, alle Setter usw. noch eingestellt werden.
Anbei eine RAW, wie ich dies bei mir angelegt habe. Alle Funktionen sind getestet und laufen:

RAW: Template tuya-mqtt Alpha Q13 Pro WiFi
defmod MQTT2_tuya_dehumidifier MQTT2_DEVICE tuya_dehumidifier
attr MQTT2_tuya_dehumidifier alias Luftentfeuchter
attr MQTT2_tuya_dehumidifier devStateIcon {\
my $onl = ReadingsVal($name,"lwt","offline") eq "offline"\
?"10px-kreis-rot" \
:"10px-kreis-gruen";; \
my $light = ReadingsVal($name,"state","off") eq "on"\
?'sani_heating_heatpump@green'\
:'sani_heating_heatpump';;\
my $humidity = ReadingsVal($name,"humidity","unknown");; \
my $fuel = ReadingsVal($name,"fuel","0") eq "ok"\
?'fuel@green'\
:'fuel@red';;\
"<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>\
".FW_makeImage($onl)." \
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a>\
".FW_makeImage($fuel)."\
<br>\
Aktuell: $humidity% rF<b></b>"\
}
attr MQTT2_tuya_dehumidifier devicetopic tuya/dehumidifier
attr MQTT2_tuya_dehumidifier event-on-change-reading anion,child_lock,command,desired-humidity,fuel,lwt,mode,state,swing,timer
attr MQTT2_tuya_dehumidifier event-on-update-reading humidity
attr MQTT2_tuya_dehumidifier group Automatik
attr MQTT2_tuya_dehumidifier readingList $DEVICETOPIC/status:.* lwt\
$DEVICETOPIC/dps/state:.* command\
$DEVICETOPIC/dps/1/state:.* { $EVENT =~ s/true/on/;; $EVENT =~ s/false/off/;; $EVENT =~ m/(on|off)/ ? { state => $1 } : undef }\
$DEVICETOPIC/dps/2/state:.* desired-humidity\
$DEVICETOPIC/dps/5/state:.* mode\
$DEVICETOPIC/dps/6/state:.* humidity\
$DEVICETOPIC/dps/8/state:.* swing\
$DEVICETOPIC/dps/10/state:.* anion\
$DEVICETOPIC/dps/16/state:.* child_lock\
$DEVICETOPIC/dps/17/state:.* timer\
$DEVICETOPIC/dps/19/state:.* { $EVENT =~ s/0/ok/;; $EVENT =~ s/4/full/;; $EVENT =~ m/(ok|full)/ ? { fuel => $1 } : undef }
attr MQTT2_tuya_dehumidifier room FHEM / Info,MQTT2_DEVICE
attr MQTT2_tuya_dehumidifier setList on:noArg $DEVICETOPIC/dps/1/command true\
off:noArg $DEVICETOPIC/dps/1/command false\
desired-humidity:slider,25,1,80 $DEVICETOPIC/dps/2/command $EVTPART1\
mode:Manual,Clothdrying,SLeeping $DEVICETOPIC/dps/5/command $EVTPART1\
swing:true,false $DEVICETOPIC/dps/8/command $EVTPART1\
anion:true,false $DEVICETOPIC/dps/10/command $EVTPART1\
child_lock:true,false $DEVICETOPIC/dps/16/command $EVTPART1\
timer:cancel,1h,2h,3h,4h,5h,6h,7h,8h,9h,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,20h,21h,22h,23h,24h $DEVICETOPIC/dps/17/command $EVTPART1
attr MQTT2_tuya_dehumidifier setStateList on off
attr MQTT2_tuya_dehumidifier webCmd desired-humidity:mode:timer:swing:anion:child_lock
attr MQTT2_tuya_dehumidifier webCmdLabel Humidity:Mode:Timer\
:Swing:Anion:Child Lock

setstate MQTT2_tuya_dehumidifier on
setstate MQTT2_tuya_dehumidifier 2022-01-06 14:11:53 IODev MQTT2_FHEM_Server
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:14:24 anion true
setstate MQTT2_tuya_dehumidifier 2022-01-06 10:26:46 associatedWith MQTT2_tuya_bridge
setstate MQTT2_tuya_dehumidifier 2022-01-06 11:43:04 child_lock false
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:52:33 command {"6":38}
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:14:38 desired-humidity 25
setstate MQTT2_tuya_dehumidifier 2022-01-07 11:41:40 fuel ok
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:52:33 humidity 38
setstate MQTT2_tuya_dehumidifier 2022-01-06 10:08:59 lwt online
setstate MQTT2_tuya_dehumidifier 2022-01-06 12:49:38 mode Manual
setstate MQTT2_tuya_dehumidifier 2022-01-06 13:12:02 state on
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:29:03 swing false
setstate MQTT2_tuya_dehumidifier 2022-01-07 10:33:51 timer 10h


Ich ergänze noch Userreadings und ein angepasstes devStateIcon um auch das Ende eines Timers darzustellen (beides RAW!).
attr MQTT2_tuya_dehumidifier userReadings timer_end:timer:.*h { my $timer = ReadingsVal("$name","timer","");; $timer =~ s/h//;; $timer = $timer * 60;; $timer = POSIX::strftime("%H:%M",localtime(time+$timer*60)) },\
timer_end:timer:.cancel { "n.A." }


attr MQTT2_tuya_dehumidifier devStateIcon {\
my $onl = ReadingsVal($name,"lwt","offline") eq "offline"\
?"10px-kreis-rot" \
:"10px-kreis-gruen";; \
my $light = ReadingsVal($name,"state","off") eq "on"\
?'sani_heating_heatpump@green'\
:'sani_heating_heatpump';;\
my $humidity = ReadingsVal($name,"humidity","unknown");;\
my $timerend = ReadingsVal($name,"timer_end","unknown");; \
my $fuel = ReadingsVal($name,"fuel","0") eq "ok"\
?'fuel@green'\
:'fuel@red';;\
"<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>\
".FW_makeImage($onl)." \
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a>\
".FW_makeImage($fuel)."\
<br>\
Aktuell: $humidity% rF\
<br>\
Timer Ende: $timerend <b></b>"\
}


Wenn nun ein Timer gesetzt wird, wird der Endzeitpunkt berechnet und in timer_end gespeichert.
Beispiele:
timer         6h       2022-01-07 16:36:27
timer_end  22:36  2022-01-07 16:36:27

timer         14h     2022-01-07 16:41:21
timer_end  06:41  2022-01-07 16:41:21

Ich hoffe das wird irgendwann jemandem helfen! Viel Spaß damit :)
Anbei ein Screenshot, wie das Gerät dann am Ende aussieht.

Gruß,
87Insane