Ein sehr nützliches Tool hab ich per Zufall entdeckt. Es löst Probleme unzureichender Smart-Funktionen von Fernsehern und anderen IR-Fähigen Geräten. Ein IR-Controller, welche per ZigBee angesteuert werden kann.
Hardware
Ich habe den Tuya TS1201 im Einsatz und mit Zigbee2MQTT verbunden.
OpenHAB: Things
Wichtig erscheinen mit lediglich der Batterie-Status und eben der IR-Code, der gesendet werden soll.
Thing topic irController "IR Controller" {
Channels:
Type number : battery [ stateTopic="+/+/+/+/irController/0x70ac08fffe123370" , transformationPattern="JSONPATH:$.battery" ]
Type string : ir_code_to_send [ commandTopic="tensorpi2/eg/livingRoom/undef/irController/0x70ac08fffe123370/set", transformationPatternOut="MAP:samsungTV.map∩JS:openhabStringVar2zigbeebridge.script?var_name=ir_code_to_send" ]
}
OpenHAB: Transforms
In den Things werden zwei Transforms verwendet. Diese sind bereits für OpenHAB v. 4.x angepasst. Dementsprechend wird dort noch das JS-Binding gebraucht, damit eines davon ausgeführt werden kann.
openhabStringVar2zigbeebridge.script soll nichts anderes tun, als den zu sendenden code in eine JSON-Variable zu packen:
(function(input,var_name) {
return "{\"" + var_name + "\": \"" + input + "\" }" ;
})(input,var_name)
samsungTV.map enthält die zu sendenden Codes, passend zu den tasten auf der Fernbedienung. Die Codes habe ich vorher mittels zigbee2mqtt und dem IR-Controller ausgelesen (ggf. weichen eure Codes davon ab):
On=B6wRrBE1ApQG4AED4AsB4BcfQAFAI+APAcAbQAfgCwMH0LesEawRNQLgAxvgCwHgFx9AAUAj4A8BwBtAB+AIAwIGNQI=
Off=B6wRrBE1ApQG4AED4AsB4BcfQAFAI+APAcAbQAfgCwMH0LesEawRNQLgAxvgCwHgFx9AAUAj4A8BwBtAB+AIAwIGNQI=
An=B6wRrBE1ApQG4AED4AsB4BcfQAFAI+APAcAbQAfgCwMH0LesEawRNQLgAxvgCwHgFx9AAUAj4A8BwBtAB+AIAwIGNQI=
Aus=B6wRrBE1ApQG4AED4AsB4BcfQAFAI+APAcAbQAfgCwMH0LesEawRNQLgAxvgCwHgFx9AAUAj4A8BwBtAB+AIAwIGNQI=
1=B8QRxBEzApsG4AED4AsB4BcfwAFAJ+ALAUAXQANAAUAH4AcDB863xBHEETMC4AMX4AsB4BcfwAFAJ+ALAUAXQANAAUAH4AcD4HyHAgYzAg==
2=B6kRqRE0ApgG4AED4AsB4BsfQAFAJ+APAcAbQAfgBwMHxbepEakRNALgAxfgCwHgGx9AAUAn4A8BwBtAB+AEAwIGNAI=
3=B7cRtxEzAp0G4AED4AsB4BcfQAHAI+ALAUAbwAFAC+AHAwfIt7cRtxEzAuADF+ALAeAXH0ABwCPgCwFAG8ABQAvgBAMCBjMC
4=B60RrRE2ApMG4AED4AsB4Bcf4AMBQCvgBwFAE8ADQAHAC8AHB9m3rRGtETYCwA9AB+ALAUAXwAPgFwFAJ+AHAUATwANAAcALB5MGNgKTBjYC
5=B7ARsBEuAqsG4AED4AsB4BsfwAFAK+ALAUAXQANAAUAH4AMDB863sBGwES4C4AMT4AsB4BsfwAFAK+ALAUAXQANAAUAHC6sGLgKrBi4CqwYuAg==
6=B7kRuRE0ApcG4AED4AsB4BcfQAFAI0ABwAfgAwHAE+ADB0ALwAMH8re5EbkRNALAD0AH4AsBQBfAA+APAUAfQAHAB+ADAcAT4AMHC5cGNAKXBjQClwY0Ag==
7=B5cRlxEzAp0G4AED4AsB4BcfwAHAJ+AHAeAHF8APwAcHz7eXEZcRMwLAD0AH4AsBQBfAA+ATAeAPI+AHF8APB50GMwKdBjMC
8=B7kRuRE0ApcG4AED4AsB4BsfQAHAJ+ALAUAbwAFAC+ADAwfxt7kRuRE0AuADE+ALAeAbH0ABwCfgCwFAG8ABQAsLlwY0ApcGNAKXBjQC
9=B6ERoRE2ApEG4AED4AsB4BcfQAHgEyNAG+ADAUAP4AMDB+y3oRGhETYC4AMT4AsB4BcfQAHgEyNAG+ADAUAPC5EGNgKRBjYCkQY2Ag==
0=B7URtRE0ApoG4AED4AsB4Bsf4AMBQC/gBwFAE8ADQAHAC0AHB9q3tRG1ETQCQAvAA+ALAcAbQAfgCwHgBxfgBw9AAUATwANAAQuaBjQCmgY0ApoGNAI=
Source=B60RrRE1ApUG4AED4AsB4Bsf4BcB4AND4AcLB8S3rRGtETUC4AMX4AsB4Bsf4BcB4AND4AQLAgY1Ag==
Quelle=B60RrRE1ApUG4AED4AsB4Bsf4BcB4AND4AcLB8S3rRGtETUC4AMX4AsB4Bsf4BcB4AND4AQLAgY1Ag==
Teletext=B7YRthEzAp4G4AED4AsB4BcfwAHAJ0ABQAvAAUALQAPAAcALQAdAAwfFt7YRthEzAkALwAPgCwHAG0AH4BMBQB9AA0ABwAdAAUALQAPAAcALQAdAA+B8hwIGMwI=
PRE-CH=B54RnhE0ApgG4AED4AsB4B8fwAFAL+ALAUAXQANAAUAHwAMH0beeEZ4RNALAD0AH4AsBQBfAA+ALAeAHG0AP4AsBQBdAA0ABC5gGNAKYBjQCmAY0Ag==
lauter=B7MRsxEzApwG4AED4AsB4Dcf4AMB4ANLwAsH6rezEbMRMwLAD0AH4AsBQBfAA+ALAcAbQAfgFwFAI+AHA+B8hwIGMwI=
leiser=B7kRuREvAqsG4AED4AsB4B8fQAFAK+APAcAbQAfgAwMHx7e5EbkRLwLgAxPgCwHgHx9AAUAr4A8BwBtABwurBi8CqwYvAqsGLwI=
Mute=B8cRxxEvAqgG4AED4AsB4CMfQCvgFwFAI+ADAwfOt8cRxxEvAuADE+ALAeAjH0Ar4BcBQCMLqAYvAqgGLwKoBi8C
Stumm=B8cRxxEvAqgG4AED4AsB4CMfQCvgFwFAI+ADAwfOt8cRxxEvAuADE+ALAeAjH0Ar4BcBQCMLqAYvAqgGLwKoBi8C
CH List=B8gRyBEvAqcG4AED4AsB4B8fQAFAK0ABQAdAA+ADAcAPwAdAAUALB9C3yBHIES8CQAvAA+ALAcAbQAfgCwFAF0ADQAHgAwfAC8ABwA/ABwcvAi8CpwYvAg==
CH up=B6YRphE3ApEG4AED4AsB4BcfQAFAI8AB4AMLQAHAD0AHQANAAUAHwAMHxbemEaYRNwLAD0AH4AsBQBfAA+APAUAfwAHgAwtAAcAPQAdAA0ABC5EGNwKRBjcCkQY3Ag==
weiter=B6YRphE3ApEG4AED4AsB4BcfQAFAI8AB4AMLQAHAD0AHQANAAUAHwAMHxbemEaYRNwLAD0AH4AsBQBfAA+APAUAfwAHgAwtAAcAPQAdAA0ABC5EGNwKRBjcCkQY3Ag==
CH down=B7QRtBE2ApIG4AED4AsB4Bcf4AcBQC/gAwFAD+ADA0AB4AMPB863tBG0ETYC4AMT4AsB4Bcf4AcBQC/gAwFAD+ADA0ABC5IGNgKSBjYCkgY2Ag==
Settings=B8URxREzApsG4AED4AsB4BcfQAFAI0ABQAdAA+ADAcAPwAdAAUALwAMHzLfFEcURMwLAD0AH4AsBQBfAA+APAUAfQAFAB0AD4AMBwA/AB0ABC5sGMwKbBjMCmwYzAg==
Einstellungen=B8URxREzApsG4AED4AsB4BcfQAFAI0ABQAdAA+ADAcAPwAdAAUALwAMHzLfFEcURMwLAD0AH4AsBQBfAA+APAUAfQAFAB0AD4AMBwA/AB0ABC5sGMwKbBjMCmwYzAg==
Home=B7cRtxE1ApUG4AED4AsB4BsfwAHgAytAC8ABQAtAA+AHAUATB863txG3ETUCQAvAA+ALAcAbQAfgCwHgAxdAC+ADA8ABwBPgBwEDlQY1Ag==
Guide=B50RnRExAqMG4AED4AsB4CMfQCvAAeADC+ADAUAXQANAAUAHB8a3nRGdETECQAvAA+ALAcAbQAfgCwFAF+ADA8ABQBPgCwFAFwujBjECMQIxAqMGMQI=
Manual=B7QRtBE0ApgG4AED4AsB4CMf4Bcr4AMBwCsH8Le0EbQRNALAD0AH4AsBQBfAA+ALAcAb4AcH4BcBB5gGNAKYBjQC
Info=B6ARoBE1ApQG4AED4AsB4CMfwCvgFwHAJ0AHB9S3oBGgETUCQAvAA+ALAcAbQAfgCwFAF+AHA+AXAQuUBjUClAY1ApQGNQI=
up=B6oRqhE1ApUG4AED4AsB4Bcf4AsBwDNAAcAL4AMHwAFAEwfHt6oRqhE1AkALwAPgCwHAG0AH4B8BQCtAA0ABQAfgBwPAAUAX4HyHAgY1Ag==
hoch=B6oRqhE1ApUG4AED4AsB4Bcf4AsBwDNAAcAL4AMHwAFAEwfHt6oRqhE1AkALwAPgCwHAG0AH4B8BQCtAA0ABQAfgBwPAAUAX4HyHAgY1Ag==
down=B5wRnBEwAqoG4AED4AsB4Bsf4AcBwDPAAcAPwAfAAUAPB8i3nBGcETACQAvAA+ALAcAbQAfgCwHgCxdAE0ADwAFAC+ADAwswAjACMAIwAqoGMAI=
runter=B5wRnBEwAqoG4AED4AsB4Bsf4AcBwDPAAcAPwAfAAUAPB8i3nBGcETACQAvAA+ALAcAbQAfgCwHgCxdAE0ADwAFAC+ADAwswAjACMAIwAqoGMAI=
left=B8kRyRE0ApgG4AED4AsB4BsfQAFAJ8ABQAtAA8ABwAtAB0ADwAFACwfUt8kRyRE0AkALwAPgCwHAG0AH4AsBwBfAB0ABQAtAA8ABwAtAB0ADCzQCNAI0AjQCmAY0Ag==
links=B8kRyRE0ApgG4AED4AsB4BsfQAFAJ8ABQAtAA8ABwAtAB0ADwAFACwfUt8kRyRE0AkALwAPgCwHAG0AH4AsBwBfAB0ABQAtAA8ABwAtAB0ADCzQCNAI0AjQCmAY0Ag==
right=B54RnhEzAp4G4AED4AsB4BcfQAFAI+ADAUAPQANAAeADB0ALQAPAAUALCPe3nhGeETMCnuBzhwIGMwI=
rechts=B54RnhEzAp4G4AED4AsB4BcfQAFAI+ADAUAPQANAAeADB0ALQAPAAUALCPe3nhGeETMCnuBzhwIGMwI=
Enter=B68RrxEvAqwG4AED4AsB4Bcf4AMBQCtAAUAHQANAAUAHwANAAUALwAFACwfBt68RrxEvAkALwAPgCwHAG0AH4BcBwCNAB0ADQAFAB8ADQAFACwsvAi8CLwIvAqwGLwI=
OK=B68RrxEvAqwG4AED4AsB4Bcf4AMBQCtAAUAHQANAAUAHwANAAUALwAFACwfBt68RrxEvAkALwAPgCwHAG0AH4BcBwCNAB0ADQAFAB8ADQAFACwsvAi8CLwIvAqwGLwI=
Return=B6MRoxE1ApQG4AED4AsB4Bcf4AMBwCtAAUALQAFAB8ADwAFAD0ABQAcHw7ejEaMRNQJAC8AD4AsBwBtAB+ADAQJ0AjXgCAFAI0ADQAHgAwdAC0ADwAELlAY1AjUCNQKUBjUC
Exit=B7wRvBEwAqUG4AED4AsB4BsfQAHAJ0ABQAvgAwHgAw/AC0AHQAMH7Le8EbwRMAJAC8AD4AsBwBtAB+ALAcAXQAdAA0ABwAfAAeADD8ALB6UGMAKlBjAC
A=B7gRuBE2Ao8G4AED4AsB4BcfwAHAJ0AB4A8LQAFAG8ABQAsHx7e4EbgRNgJAC8AD4AsBwBtAB+ATAUAfQANAAUAHQANAAUAHQAPAAeAECwIGNgI=
B=B7ARsBE2ApEG4AED4AsB4BcfwAFAJ0ABwAfAAUAPQANAAeADB0ALQAMHw7ewEbARNgJAC8AD4AsBwBtAB+ATAcAfwAfAAUAPQANAAeADBweRBjYCkQY2Ag==
C=B7cRtxE2ApMG4AED4AsB4BsfQAFAJ0ABwAfgAwHAE+ADB0ALQAMHzbe3EbcRNgJAC8AD4AsBwBtAB+ALAcAX4AcH4AMB4AcbC5MGNgKTBjYCkwY2Ag==
D=B8MRwxE1ApMG4AED4AsB4BcfQAHAI0ABQAvgAwHgAw/AC0AHwAMHybfDEcMRNQLAD0AH4AsBQBfAA+APAeADH0AL4AMB4AMPwAsLkwY1ApMGNQKTBjUC
PIC Size=B58RnxE1ApQG4AED4AsB4BcfQAHgAyPAC8ABQA/gCwFAF0ADB823nxGfETUCQAvAA+ALAcAbQAfgDwFAG+AHA8ABQBfgCwEHlAY1ApQGNQI=
Picture=B7oRuhEyAqAG4AED4AsB4Bcf4AMBQCtAAcAHQAFAC8ADQAFAC0ABQAdAAwfPt7oRuhEyAkALwAPgCwHAG0AH4BcBwCPAB0ABQAvAA0ABQAsLMgIyAqAGMgKgBjIC
AD/Subt=B68RrxE1ApQG4AED4AsB4BsfQAFAJ8AB4AMLQAHAD0AHQANAAUAHQAMHxbevEa8RNQJAC8AD4AsBwBtAB+ALAcAXwAdAAeADC0ABwA9AB0ADCzUCNQKUBjUClAY1Ag==
Stop=B58RnxE1ApMG4AED4AsB4BcfQAHAI+ADAUATQAHAB0ABQAvAA0ABQAsHyLefEZ8RNQJAC8AD4AsBwBtAB+APAUAbQAPgAwHAD8AHQAFAC8ADBzUCNQKTBjUC
Zurückspulen=B7MRsxE1ApQG4AED4AsB4BsfQAFAJ+ADAeADD8ALQAfAA0ABQAsH07ezEbMRNQJAC8AD4AsBwBtAB+ALAcAXwAfAAeADD8ALQAfAAwc1AjUClAY1Ag==
Zurück=B7MRsxE1ApQG4AED4AsB4BsfQAFAJ+ADAeADD8ALQAfAA0ABQAsH07ezEbMRNQJAC8AD4AsBwBtAB+ALAcAXwAfAAeADD8ALQAfAAwc1AjUClAY1Ag==
Play=B8ERwRExAqEG4AED4AsB4BcfQAFAI0ABwAdAAcAL4AsH4AMTB9u3wRHBETECQBPAA+ALAcAbQAfgDwHAG8AHQAHAC+ALBwuhBjECMQIxAqEGMQI=
Pause=B7YRthE1ApMG4AED4AsB4BcfQAFAI0ABwAdAAcAL4AsH4AMTB/a3thG2ETUCQBPAA+ALAcAbQAfgDwHAG8AHQAHAC+ALBwuTBjUCNQI1ApMGNQI=
Vorspulen=B5URlRE0ApkG4AED4AsB4Bcf4AMBQCvAAcALQAfAA0AB4AcLB+23lRGVETQCwBdAB+ALAUAXwAPgFwFAJ8ABwAtAB8ADQAHgBAsCBjQC
Vor=B5URlRE0ApkG4AED4AsB4Bcf4AMBQCvAAcALQAfAA0AB4AcLB+23lRGVETQCwBdAB+ALAUAXwAPgFwFAJ8ABwAtAB8ADQAHgBAsCBjQC
Teile der Codes scheinen irrelevant, da sie sich bei jeder Messung unterscheiden. Nur bestimmte Bereiche der Zeichenketten bleiben immer gleich.
OpenHAB: Items
Ich fasse die Items zu einer Item-Group zusammen. Diese entsprechen immer einem realen Gegenstand. In diesem Fall: dem Fernseher.
Die Lautstärke muss von den anderen Tasten getrennt werden, da Alexa sonst nicht damit klar kommt. Ansonsten definiere ich hier einfach, welche Sprachbefehle akzeptiert werden.
Die Batterie wird aufgrund der semantischen Definition automatisch überwacht.
Group igSamsungTV "Fernseher" <screen> (sgLivingRoom)["Television"] { alexa="Television" }
Number:Dimensionless irController_battery "Batterie [%.1f %%]" <Battery> (igSamsungTV)["Battery","Measurement","Energy"] { channel="mqtt:topic:myMosquitto:irController:battery" }
String irController_send "Taste" (igSamsungTV) {
channel="mqtt:topic:myMosquitto:irController:ir_code_to_send",
alexa="Mode" [ supportedModes="On,Off,An,Aus,1,2,3,4,5,6,7,8,9,0,Teletext,Source,Quelle,Mute,Stumm,Einstellungen,Settings,hoch,runter,links,rechts,OK,Enter,Home,Return,Exit,A,B,C,D,Stop,Zurück,Zurückspulen,Play,Weiter,Pause,Vorspulen" ]
}
String irController_LautstRke "Lautstärke" <SoundVolume> (igSamsungTV)["Control"] {
channel="mqtt:topic:myMosquitto:irController:ir_code_to_send",
alexa="VolumeStep" [ VOLUME_UP="lauter", VOLUME_DOWN="leiser" ]
}