ééããªããApple iOSã¯æã人æ°ã®ããã¢ãã€ã«OSã®1ã€ã§ããç¶ããŸããã€ãŸããçŸä»£ã®èªååã·ã¹ãã ã¯ãã®ãšã³ã·ã¹ãã ã«çµ±åããçžäºäœçšããæ©èœãæäŸã§ããå¿ èŠããããŸãã ãã®ç®çã®ããã«ãHomekitãã¬ãŒã ã¯ãŒã¯ãèšèšãããŠããŸããããã«ãããiPhone / iPad / iWatchãããã«æè¿ã§ã¯MacïŒmacOS MojaveïŒã®ç»é¢ããã¹ããŒãããã€ã¹ãæäœã§ããŸãã
ã»ãšãã©ã®èªååã·ã¹ãã ïŒããŒã±ãã£ã³ã°åãã¹ããŒãããŒã ãã¯å¥œãã§ã¯ãããŸããïŒã«ã¯ãHomekitãšçµ±åããããã®ã¢ãžã¥ãŒã«ãé·ãå«ãŸããŠããŸããããã¬ãŒãã³ã°ãåãããŠãŒã¶ãŒã§ãã£ãŠããããã€ã¹ãããŒã ïŒãŸãã¯ã€ãïŒã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšå¯èœã«ããæ¹æ³ãçè§£ããããšã¯å¿ ããã容æã§ã¯ãããŸããã
仿¥ã¯ãioBrokerã·ã¹ãã ïŒããã¯ãªãŒãã³ã§ç¡æã®èªååã·ã¹ãã ã§ãïŒã§ãããã®æäœãè¡ãæ¹æ³ã説æããŸãã ããããããã€ã¹ã®å€ãã®äŸããã¹ãŠæãã«æã£ãŠããªãããã«ãããã€ãã®ååã説æããã¢ãããŒãã瀺ããããšæããŸãã
ãããã€ãã®ååãç¥ãããšã¯ãããã€ãã®äºå®ãç¥ããªãããšãç°¡åã«è£ããŸããã
ã¯ããŒãã»ãšã€ããªã¢ã³ã»ãã«ããã£ãŠã¹
ioBrokerã ãã©ã€ããŒãããã€ã¹ãããã³ã¹ããŒã¿ã¹
ãŸããioBrokerã·ã¹ãã ã«å«ãŸããããã€ã¹ãšãã®è¡šç€ºæ¹æ³ã«ã€ããŠèª¬æããŸãã
ioBrokerã·ã¹ãã ã¯ã¢ãžã¥ãŒã«åŒã§ãããæ¡åŒµã¢ãžã¥ãŒã«ã¯ãã©ã€ããŒïŒãŸãã¯ã¢ããã¿ãŒïŒãšåŒã°ããŸãã ãã©ã€ããŒã¯ãããã€ãã®ããã€ã¹ãŸãã¯ããã€ã¹ã®ã°ã«ãŒããšã®çµ±åã¢ãžã¥ãŒã«ã§ãããå ±éã®æ©èœããããã³ã«ããŸãã¯è£œé å ã«ãã£ãŠçµ±åãããŠããããã1ã€ããè€æ°ã®ããã€ã¹ã«ioBrokerã·ã¹ãã ã«ããã©ãã°ãã§ããŸãã å¥ã®æ©èœã¯ãèšå®ãç°ãªãåããã©ã€ããŒã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæ©èœã§ãã
ããããåããã€ã¹ã¯ãŠããŒã¯ã§ç¬ç¹ã§ãããç°ãªãç¹æ§ãšæ©èœãåããŠããŸãã ããã«åºã¥ããŠãioBrokerã¯äž»ã«ããã€ã¹èªäœã§ã¯ãªããç¶æ ã«ãã£ãŠè¡šããããã®ç¹æ§ã«çŠç¹ãåãããŸãã ç¶æ ã¯ãå€ãåãå ¥ããŠä¿åããå éšioBrokerãªããžã§ã¯ãã§ãã ç¶æ ã®å矩èªãšèŠãªãããšãã§ããŸãïŒèšå·ã屿§ãç¹æ§ãããããã£ãã€ãã³ãã æ¡ä»¶ã®äŸïŒã枩床ãããèŒåºŠã¬ãã«ãããããããªãŒã¬ãã«ããã黿ºæå ¥ãã©ã°ããããšã©ãŒãã©ã°ãããæŒããã©ã°ãããäºéæŒããã©ã°ããªã© ãããã£ãŠãåããã€ã¹ã¯ããŸããŸãªç¶æ ã§è¡šãããŸãã
ç¶æ ã¯ãæçãªç¶æ ïŒããã€ã¹ããã®æ å ±ã衚瀺ããç¶æ ãããã³å¯å€ç¶ââæ ïŒã«åé¡ã§ããŸããç¶æ ã¯ããŠãŒã¶ãŒãŸãã¯ã¹ã¯ãªããã«ãã£ãŠå€æŽãããããã®å€æŽãããã€ã¹ã«éä¿¡ã§ããŸãã ãããã£ãŠãããã€ã¹äžã§äœãã倿Žãããå Žå-ãã®ããŒã¿ã¯ç¶æ ã§è¡šç€ºãããç¶æ ãioBrokerããïŒãŠãŒã¶ãŒãŸãã¯ã¹ã¯ãªããã«ãã£ãŠïŒå€æŽãããå Žå-ããã€ã¹ã¯å€æŽã«é¢ããä¿¡å·ãåä¿¡ããããã«å¿ããŠå¿çããå¿ èŠããããŸãïŒããã€ã¹èªäœãšããã䜿çšãããã©ã€ããŒã«ãã£ãŠç°ãªããŸãïŒäœåïŒã
ãã¹ãŠã®ããã€ã¹ç¶æ ã¯ãç¶æ ã®åäžããªãŒïŒã¬ãžã¹ããªïŒã«çµåãããŸãã ãããã¯ãæåã«ããã€ã¹ããšã«ã°ã«ãŒãåããïŒå Žåã«ãã£ãŠã¯ãã£ãã«ããšã®ã°ã«ãŒãåãåŒãç¶ã䜿çšãããŸãïŒã次ã«ãã©ã€ããŒã€ã³ã¹ã¿ã³ã¹ããšã«ã°ã«ãŒãåãããŸãã
MQTTãããã³ã«ãããã¯ã®æŠå¿µã¯ããã®ãããªç¶æ ããªãŒã«ç°¡åã«é©åããŸãã ãã®ããã«ããŠãMQTTãããã³ã«ããµããŒããã远å ã®æ©åšãŸãã¯ãµãŒãããŒãã£ã·ã¹ãã ãæ¥ç¶ã§ããŸãã MQTTãã©ã€ããŒãã€ã³ã¹ããŒã«ããã ãã§ååã§ã-察å¿ãããã©ã³ããç¶æ ããªãŒã«è¡šç€ºãããŸãã
ãŸããæçšãªæ å ±ãæäŸããããä»ã®æ©åšïŒè»ã®ã¢ã©ãŒã ãªã©ïŒãå¶åŸ¡ãããããããšãã§ãããããããçš®é¡ã®ãªã³ã©ã€ã³ãµãŒãã¹ããããŸãã ãããã®ãµãŒãã¹ãšã®çžäºäœçšã®çµæããäžé£ã®ç¶æ ãšããŠè¡šãããŸãã
åèšã§ãioBrokerã®ããã€ã¹ã¯ãããã€ã¹ãç¹åŸŽã¥ããããã€ã¹ãšå¯Ÿè©±ã§ããç¶æ ã®ã»ããã§è¡šãããŸãã
ããŒã ããã ã¢ã¯ã»ãµãªãŒããµãŒãã¹ã仿§
次ã«ãHomekitã䜿çšããŸãã ããã§ã¯ãããã€ã¹ã®åé¡ããããã®æ©èœãšç¹æ§ãé©çšãããŸãã
ã¢ã¯ã»ãµãªã¯ç©çããã€ã¹ã«çžåœããŸãã ã¢ã¯ã»ãµãªã«ã¯ãç¹å®ã®ã°ã«ãŒãã«å²ãåœãŠãããã®ã«ããŽãªããããŸã ã
ãµãŒãã¹ã¯ãã¢ã¯ã»ãµãªã®æ©èœãšåçã§ãã 1ã€ã®ã¢ã¯ã»ãµãªã«è€æ°ã®ãµãŒãã¹ãèšå®ã§ããŸãã
ãµãŒãã¹ã¯ãããã€ã¹ã®æ©èœã瀺ããŸãïŒã©ã³ããããããªãŒããã¿ã³ã空æ°è³ªã»ã³ãµãŒããã¢ããšã¢ã¯ãªãŒããŒãã«ã¡ã©..
ãã£ã¹ãã¬ã€ãããã€ã¹ã®åäœãããã³ç¹æ§ã»ãããæ±ºå®ããã®ã¯ãµãŒãã¹ã§ãã
ç¹æ§ã¯ããµãŒãã¹ãç¹åŸŽä»ãã屿§/ããããã£ã«çžåœããŸãã ããã€ã¹ã®é»æºããªã³ã«ãªã£ãŠãããã©ãããã©ã³ãã®èŒåºŠã¬ãã«ããŸãã¯ãã¿ã³ãæŒãããåæ°ãæ±ºå®ããç¹æ§ã§ãã åäžã®ãµãŒãã¹ã«ã¯å€ãã®ç¹æ§ããããŸãã
Homekitã§åäœããã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ã¯ã»ãµãªã®ãµãŒãã¹ãšç¹æ§ãèªã¿åãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠç¹æ§ã®å€ã衚瀺ããã³å€æŽã§ããŸãã 倿Žãããå€ã¯ãããããé©çšããããã«Homekitããã€ã¹ã«éä¿¡ãããŸãããŸããHomekitããã€ã¹ããããããã€ã¹ã®åŽé¢ããããã€ãã®å€æŽãšãšãã«ç¹æ§ã®å€ãéä¿¡ãããŸãã
å šäœãšããŠãHomeKitã®ããã€ã¹ã¯ãäžé£ã®ãµãŒãã¹ãšæ©èœãåããã¢ã¯ã»ãµãªã®ããã§ãã
ã€ãã«ã ã³ã³ã»ããã«åå ããŸã
Homekitã䜿çšããã«ã¯ãioBrokerã¯Yahkaãã©ã€ããŒã䜿çšããŸã ïŒ ã€ã³ã¹ããŒã«ã®åã«è¿œå ã®ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒ-ããç¥ãããŠããã©ã€ãã©ãªãžã®ã¢ããªã³ https://github.com/KhaosT/HAP-NodeJS ã人æ°ã®ããHomeBridgeãããžã§ã¯ãããã«ãããŸãã ãã®ã©ã€ãã©ãªã¯ãHomeKitã§ä»®æ³ããã€ã¹ã®ã»ãããæäŸããä»®æ³ã²ãŒããŠã§ã€/ããªããžãäœæããããã«èšèšãããŠããŸãã ä»®æ³ããã€ã¹ãšãµãŒãã¹ãé©å®æ§æããç¹æ§ã®å€ãèšå®ãããã宿ããããã€ã¹ãHomekitãšHomeã¢ããªã±ãŒã·ã§ã³ã§ååŸããSiriã«ç®¡çãäŸé Œããããšãã§ããŸãã
Yahkaãã©ã€ããŒã¯ãã¢ã¯ã»ãµãªãŒãæ§æãããããã«ãµãŒãã¹ã远å ããç¹æ§ïŒHomeKitïŒããã³æ¡ä»¶ïŒioBrokerïŒã®ã³ã³ãã©ã€ã¢ã³ã¹ã瀺ãããã«èšèšãããŠããŸãã
ãã ããæåã«ãã€ã³ã¹ããŒã«åŸãã²ãŒããŠã§ã€ãæ§æããŠããŒã ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãå¿ èŠããããŸãã èšå®åŸãã²ãŒããŠã§ã€ã«è¿œå ããããã¹ãŠã®ããã€ã¹ã¯èªåçã«ããŒã ã«è¿œå ãããŸãã ãããè¡ãã«ã¯ããããã€ã¹åããæå®ãïŒã©ãã³æåã®ã¿ãæå®ããããšãæãŸããïŒãPINã³ãŒããèšæ¶ããŸãïŒãŸãã¯ç¬èªã«èšå®ããŸãïŒã
ããã§ã¯ãããã€ã¹ã«ã€ããŠèª¬æããŸãããã ioBrokerã®ããã€ã¹ã®ç¶æ ã®ã»ãããHomeKitã®ãµãŒãã¹ãšæ©èœã®ã»ããã«äžæã«å¯Ÿå¿ããŠããã°ããã¹ãŠããŸããããŸãã ãããŠãå·ã®å€ãç¹æ§ã®å€ã«é©ããŠããã°ããã«è¯ãã§ãããã ããããããã¯ããã§ã¯ãªãããšãå€ãããããã³ã°ããããã®ç°åžžãªæ¹æ³ãèãåºãå¿ èŠããããŸãã ãããã®ããã€ãã«ã€ããŠä»¥äžã§èª¬æããŸãããä»ã®ãã¹ãŠã®ãªãã·ã§ã³ããã€ã¡ãŒãžãšäŒŒå§¿ã§ãèªåã§å®è£ ããå¿ èŠããããŸãã
䟿å®äžããµãŒãã¹ãšã¿ã€ãã®å€æãããã³ç¹æ§ã®å¯èœãªå€ãå«ãããã¥ã¡ã³ããäœæããŸãã ã 䜿çšããããã¹ãŠã®ã¿ã€ããšãµãŒãã¹ã¯ã HAP-NodeJSã©ã€ãã©ãªã«å¯Ÿå¿ããŠããŸã ã
枩床ã»ã³ãµãŒ
ããã¯æãåçŽãªäŸã§ã-å¿ èŠãªã®ã¯ãæž©åºŠã®æ°å€ãå«ã1ã€ã®ç¶æ ãæã€ããšã ãã§ãã ã»ã³ãµãŒãŸãã¯ã€ã³ã¿ãŒããããµãŒãã¹ïŒå€©æ°ïŒããååŸã§ããŸãã
Sensorã«ããŽãªã®ããã€ã¹ã远å ããTemperatureSensorãµãŒãã¹ãããã€ã¹ã«è¿œå ããŠããã®ãµãŒãã¹ã«ååãä»ããå¿ èŠããããŸãã ãã®ãµãŒãã¹ã«ã¯5ã€ã®ç¹æ§ãããããã®ãã¡æãéèŠãªã®ã¯CurrentTemperatureã§ãã
CurrentTemperatureç¹æ§ã§æž©åºŠã«å¯Ÿå¿ããç¶æ ã®ååã瀺ãã ãã§ååã§ãã
ããã«HumiditySensor湿床ãµãŒãã¹ã远å ãããšãHomekitã«å¥ã®ã¢ã¯ã»ãµãªãŒã¢ã€ã³ã³ãäœæãããŸãã
ä¿åããŠãå®äºã§ãã ããã§Siriã«ç®ãåããæž©åºŠãšæ¹¿åºŠã«ã€ããŠå°ããããšãã§ããŸãã
ããããªãŒ
å¥ã®ã·ã³ãã«ãªãµãŒãã¹ã ãã®ç§trickã¯ãã»ãŒãã¹ãŠã®ã¢ã¯ã»ãµãªã«è¿œå ã§ããããšã§ãã BatteryServiceãµãŒãã¹ã远å ããBatteryLevelç¹æ§ã§ããããªãŒå é»ã®å²åãå«ãç¶æ ã瀺ããŸãã ãã®åŸãå é»ããŒã¿ãããã€ã¹ã«é¢ãã远å ããŒã¿ã«è¡šç€ºãããŸãã
æå®ããç¶æ ã®å€ã1ã«çããå Žåãããã€ã¹ã€ã¡ãŒãžã«å¯Ÿå¿ããã¢ã€ã³ã³ã衚瀺ãããŸããããã«ãäœå é»ãã®ãµã€ã³ïŒç¹æ§StatusLowBatteryïŒãèšå®ã§ããŸãã
ãããããã®ãããªç¶æ ã§ã¯ãªããäœå é»ã¢ã€ã³ã³ã衚瀺ãããå Žåã¯ã©ãã§ããããïŒ ãã®ç¶æ ãæåãŸãã¯ã¹ã¯ãªããã§äœæããäœæããç¶æ ãç¹æ§ã§ç€ºãå¿ èŠããããŸãã
çŸåšã¯ããã®ç¶æ ã§å€ãæ£ããtrueã«èšå®ããã ãã§ãã ãããè¡ãã«ã¯ãã¹ã¯ãªããã䜿çšããŸããããããªãŒã30ïŒ ã«éãããšãtrueã«èšå®ãããŸãã
createState(""); on({id: "zigbee.0.00158d0001f41725.battery", change: "ne"}, function (obj) { var value = obj.state.val; setState("javascript.0.", (value <= 30)); });
æåã®å®è¡åŸãã¹ã¯ãªããã¯ç¶æ ãäœæããç¹æ§ã§éžæã§ããŸãã
ãã®ãµã€ã³ã¯ãã¢ã¯ã»ãµãªãŒã®ç»åã«è¡šç€ºãããŸã
ã©ã³ã
é»çã¯ç°ãªããŸã-æãããæãããèµ€ã 4ã€ã®ã±ãŒã¹ããããŸãã
- ã·ã³ãã«-ãªã³ãšãªãã§å¶åŸ¡
- 調å å¯èœ-èŒåºŠã¬ãã«ã§ãå¶åŸ¡
- 枩床ã§-ã°ããŒæž©åºŠãå¶åŸ¡ã§ããŸã
- è²-ã°ããŒã®è²ãå¶åŸ¡ã§ããŸã
ãããã®åã±ãŒã¹ã«ã€ããŠãLightbulbãµãŒãã¹ã«ã¯å¯Ÿå¿ããç¹æ§ããããŸãã
- ãªã³-ãªã³/ãªããåãæ¿ããŸã
- èŒåºŠ-èŒåºŠã¬ãã«
- è²çž-ã·ã§ãŒã
- 圩床-圩床
- ColorTemperature-è²æž©åºŠ
åçŽãªã±ãŒã¹ã§ã¯ãããªã³ãç¹æ§ã§ããªã³ãšãªããåãæ¿ãã責任ãããç¶æ ã瀺ããŸãã
ã©ã³ãã調å å¯èœãªå Žåã¯ãããã«èŒåºŠã¬ãã«ã§ã¹ããŒã¿ã¹ã瀺ããŸãã
æ£ããç¶æ ãå²ãåœãŠãããšã«å ããŠã蚱容å€ã®ééã芳å¯ããããšãéèŠã§ãïŒ
äŸïŒå Žåã«ãã£ãŠã¯ãã©ã³ãã®æããã®åå ãšãªãç¶æ ã¯0ã255ã®å€ãåãããšãã§ããŸãããHomekitã§ã¯ãããã®å€ã¯0ã100ã®ééã«å¶éãããŸãããã®å ŽåãYahkaãã©ã€ããŒå€æé¢æ°ã䜿çšã§ããŸãã 颿° "level255"ã¯ãå€0..255ã®ééãéé0..100ã«å€æããŸãïŒããã³ãã®éïŒã
ã©ã³ããè²ä»ããããŠããå Žåãæ¬¡ã®åé¡ãçºçããå¯èœæ§ããããŸããã䜿çšãããè²ã¯RGBã§ãã 3ã€ã®ç°ãªãç¶æ ããŸãã¯1ã€ã®çªå·ïŒãŸãã¯è¡ïŒã®ããããã§ãã ãã®å Žåã1ã€ã®RGBã«ã©ãŒã¹ããŒã¹ããå¥ã®XYBã¹ããŒã¹ïŒãã®ã¹ããŒã¹ã¯HomeKitã«ãã£ãŠäœ¿çšãããŸãïŒããŸãã¯XYãã¬ãŒã³ã«å€æããå¿ èŠããããŸãã
ãããè¡ãã«ã¯ã2ã€ã®æ°ããç¶æ ïŒè²çžãšåœ©åºŠïŒãäœæããå¿ èŠããããŸãããã®ç¶æ ã«å€ãRGBç¶æ ããããŸãã¯ãã®éã«å€æããŸãã
// createState("Hue"); createState("Sat"); // RGB- on({id: "Hue", ack: false, change: 'any'}, function (obj) { var hue = parseInt(obj.state.val); var sat = parseInt(getState('Sat').val); var res = hsvToRgb(hue, sat, 100); setRGB(parseInt(res[0]), parseInt(res[1]), parseInt(res[2])); }); // RGB- function setRGB(r, g, b){ var val = ('00'+r.toString(16)).slice(-2)+('00'+g.toString(16)).slice(-2)+('00'+b.toString(16)).slice(-2); // RGB- setState('zigbee.0.00124b0014d016ab.color', val, false); } // HSV RGB function hsvToRgb(h, s, v) { var r, g, b; var i; var f, p, q, t; h = Math.max(0, Math.min(360, h)); s = Math.max(0, Math.min(100, s)); v = Math.max(0, Math.min(100, v)); s /= 100; v /= 100; if(s == 0) { r = g = b = v; return [ Math.round(r * 255), Math.round(g * 255), Math.round(b * 255) ]; } h /= 60; i = Math.floor(h); f = h - i; p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); switch(i) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; default: // case 5: r = v; g = p; b = q; } return [ Math.round(r * 255), Math.round(g * 255), Math.round(b * 255) ]; }
è²æž©åºŠãããç°¡åã«è¡ãããšãã§ããŸã-ã©ã³ãã§äœ¿çšå¯èœãªå€ã®ç¯å²ãããã£ãŠããå ŽåãHomeKitã§äœ¿çšå¯èœãªééã«å€æã§ããŸãïŒ scaleInt颿°ã䜿çšïŒã
ãµãŒã¢ã¹ã¿ãã
ãµãŒã¢ã¹ã¿ãã-èšå®æž©åºŠãç¶æããããã€ã¹ïŒãµãŒã¢ã¹ã¿ãããµãŒãã¹ïŒã ãããã£ãŠããµãŒã¢ã¹ã¿ããã®äž»ãªç¹æ§ã¯ãç®çã®æž©åºŠïŒTargetTemperatureïŒã§ãã èšå®æž©åºŠã«å ããŠãçŸåšã®æž©åºŠïŒCurrentTemperatureïŒã瀺ãããšãã§ããŸããããã¯æ¬è³ªçã«æ å ±ã§ãïŒããã€ã¹ã¯ã»ã³ãµãŒããã®ã¿èªã¿åãããïŒã
ããŒã ã¢ããªã±ãŒã·ã§ã³ããããµãŒã¢ã¹ã¿ããã«ç®æšæž©åºŠãèšå®ãããçŸåšã®æž©åºŠãç£èŠãããŸãã ç§ã®ãµãŒã¢ã¹ã¿ããïŒZontïŒã«ã¯ãããã2ã€ã®ç¶æ ããããŸããããããã¯ããµãŒãã¹ã¯ã©ãŠãAPIãä»ããŠå©çšã§ããŸããã
HomeKitã§ããã€ã¹ã衚瀺ããããã«ãããã€ãã®å®æ°ã远å ããå¿ èŠããããŸãããçŸåšã®å ç±ç¶æ ã¯ã¢ã¯ãã£ãïŒ1ïŒãå ç±ã®ç®æšç¶æ ã¯èªåïŒ3ïŒã§ãã
ã²ã€ã
ã¬ã¬ãŒãžãã¢ïŒGarageDoorOpenerãµãŒãã¹ïŒã䜿çšãããšããµãŒã¢ã¹ã¿ããã䜿çšããããããã¹ãŠãè€éã«ãªããŸãã
䜿çšå¯èœãªç¹æ§ã®ãã¡ãã²ãŒãã«ã¯ã¿ãŒã²ããç¶æ ïŒTargetDoorStateïŒããããŸããããã¯ãã²ãŒãããéããŠããããŸãã¯ãéããŠãããããšãæãã§ããããšã瀺ããŠããŸãã ãã ããã²ãŒãã®çŸåšã®ç¶æ ïŒCurrentDoorStateïŒãæ£ãã衚瀺ããå¿ èŠããããŸãããããã¯éããŠãããéããŠãããããŸãã¯éããŠãããéããŠããã®ã§ããããã
ç§ã®å Žåãã²ãŒãã¯ioBrokerã®mqttãéããŠããã€ãã®æ å ±ç¶æ ã§éãããŸããã
- ã²ãŒãéæŸæ§ã®ãµã€ã³ïŒOBïŒ
- ã²ãŒãç§»åã®ãµã€ã³ïŒLWïŒ
ãããã®ç¶æ ã®ãããã§ãã²ãŒãã®çŸåšã®ã¹ããŒã¿ã¹ãèšç®ã§ããŸãã
- OBãšDVããªãå Žåãã²ãŒãã¯éããããŸã
- OBããªããDVãããå Žåãã²ãŒããéããŸã
- OBãããDVããªãå Žåãã²ãŒãã¯éããŠããŸã
- OBããããDVãããå Žåãã²ãŒãã¯éããŸã
ã²ãŒããééããä¿¡å·ãéä¿¡ããã«ã¯ãmqttãä»ããŠã²ãŒãå¶åŸ¡ã³ã³ãããŒã©ãŒã«ã¡ãã»ãŒãžãéä¿¡ãã2ã€ã®ç¶æ ããããŸãïŒ1ã€ã®ç¶æ ã§å¯Ÿå¿ã§ããŸãããããã§ã¯2ã€ãããŸãïŒã
- ãªãŒããã³ã°ã·ã°ãã«
- çµäºä¿¡å·
ä¿¡å·ãéä¿¡ããã«ã¯ããã¯ãªãã¯ããã¿ã³ãã·ãã¥ã¬ãŒãããå¿ èŠããããŸããå€ãtrueã«èšå®ãããã°ããããŠããfalseã«ãªã»ããããŸãã ãã®ç¹ã§ãHomeKitãšçµ±åããã«ã¯ãå¥ã®ç¶æ ãäœæããå¿ èŠããããŸãã-ãã¿ãŒã²ããã²ãŒãç¶æ ãã倿Žããããšã察å¿ããä¿¡å·ãéä¿¡ãããŸãã
ã²ãŒãã®éæŸæ§ã®å åã¯ãã¿ãŒã²ããç¶æ ïŒã€ãŸããç®æšãç®æããã®ïŒã«çœ®ãæããããšãã§ããŸãã
- CAããééããããDVããªãå Žåãã²ãŒãã¯ééãããŸã
- CAããéãããããDVãããå Žåãã²ãŒããéããŸã
- CAããéããŠããããDVããªãå Žåãã²ãŒãã¯éããŠããŸã
- CAããéããŠããããDVãããå Žåãã²ãŒãã¯éããŸã
ãŸããå¥ã®ç¶æ ãçŸåšã®ã²ãŒãç¶æ ããäœæãããµã€ã³ã®å€ãšã¿ãŒã²ããç¶æ ã«å¿ããŠã¹ã¯ãªããã«å ¥åããŸãã
createState("gate_0.current"); // createState("gate_0.target"); // // 0, 300 on({id: "mqtt.0.gate.gpio.13", ack: false, val: 1}, function (obj) { setStateDelayed("mqtt.0.gate.gpio.13", 0, 300); }); on({id: "mqtt.0.gate.gpio.12", ack: false, val: 1}, function (obj) { setStateDelayed("mqtt.0.gate.gpio.12", 0, 300); }); // on({id: "mqtt.0.gate.is_open", ack: false, val: 1}, function (obj) { // "" setState("javascript.0.gate_0.current", 0, true); }); on({id: "mqtt.0.gate.is_open", ack: false, val: 0}, function (obj) { // "" setState("javascript.0.gate_0.current", 1, true); }); // - , on({id: "javascript.0.gate_0.target", ack: false, val: 0}, function (obj) { setState("mqtt.0.gate.gpio.12", 1); }); // - , on({id: "javascript.0.gate_0.target", ack: false, val: 1}, function (obj) { setState("mqtt.0.gate.gpio.13", 1); }); on({id: "mqtt.0.gate.in_progress", ack: true, change: 'any'}, function (obj) { // " ", if (obj.state.val === 1) { // "", const target = getState("javascript.0.gate_0.target"); if (target.val === 0) { // "" setState("javascript.0.gate_0.current", 2, true); } else { // "" setState("javascript.0.gate_0.current", 3, true); } } // " ", if (obj.state.val === 0) { // "", const target = getState("javascript.0.gate_0.target"); if (target.val === 0) { // "" setState("javascript.0.gate_0.current", 0, true); } else { // "" setState("javascript.0.gate_0.current", 1, true); } } });
ã¹ã¯ãªãããå®è¡ããåŸãã¬ã¬ãŒãžãã¢ãµãŒãã¹ã®ç¹æ§ãæ§æã§ããŸãã
ã«ã¡ã©
HomeKitã«ã«ã¡ã©ã远å ããã«ã¯ããã¯ã©ã·ãã¯ãã¡ãœããã䜿çšãããŸãã ffmpegã¢ãžã¥ãŒã«ãä»ããŠã«ã¡ã©ããç»åããããŒããã£ã¹ãããããšãã§ããŸãã ããã«ãããå ¥åã¹ããªãŒã ããšã³ã³ãŒããæå·åãããHomekitã«æž¡ãããŸãã
ãŸããioBrokerãé 眮ãããŠãããµãŒããŒã«ffmpegãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
ãã©ãããã©ãŒã ããšã«ãããŸããŸãªæ¹æ³ã§ã€ã³ã¹ããŒã«ãããŸãããœãŒã¹ããã¢ã»ã³ããªããããããšãã°æ¬¡ã®ãããªæ¢è£œã®ã¢ã»ã³ããªãæ€çŽ¢ã§ããŸãã https://www.johnvansickle.com/ffmpeg/ libx264ãšã³ã³ãŒããŒãå¿ èŠã§ãã æ¬¡ã®ã³ãã³ãã䜿çšããŠãffmpegãã€ã³ã¹ããŒã«ããåŸããšã³ã³ãŒããŒã確èªã§ããŸãã
ffmpeg -codecs | grep 264
çµæã«ã¯ã次ã®åœ¢åŒã®è¡ãå«ãŸããŠããå¿ èŠããããŸãã
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_vdpau ) (encoders: libx264 libx264rgb h264_v4l2m2m )
Raspberry Pi 3ã®å ŽåãGPUããŒããŠã§ã¢ãšã³ã³ãŒãã£ã³ã°ããµããŒãããã³ãŒããã¯ãåããæ¢è£œã®ã¢ã»ã³ããªã䜿çšã§ããŸãïŒh264_omxãæ¶è²»ãªãœãŒã¹ãå°ãªãïŒã 次ã®ããã«é 眮ããŸãã
wget https://github.com/legotheboss/YouTube-files/raw/master/ffmpeg_3.1.4-1_armhf.deb sudo dpkg -i ffmpeg_3.1.4-1_armhf.deb
ãã®ã¢ã»ã³ããªã«ã¯äž¡æ¹ã®ã³ãŒããã¯ãååšããŸãïŒlibx264ããã³h264_omx
次ã«ããããŒããã£ã¹ãããå¿ èŠã®ããã«ã¡ã©ã¹ããªãŒã ã®ã¢ãã¬ã¹ãååŸããå¿ èŠããããŸãïŒãã®æé ã¯ãã®èšäºã®ç¯å²å€ã§ãïŒã ããšãã°ã æ¢è£œã®ãããªãã¯ã¹ããªãŒã ãååŸã§ããŸã ã
ã«ã¡ã©ãYahkaã«è¿œå ããã¹ããªãŒã ã®ã¢ãã¬ã¹ãæå®ããå¿ èŠã«å¿ããŠã³ãŒããã¯ãç»åãµã€ãºããã¬ãŒã ã¬ãŒãã®ãã©ã¡ãŒã¿ãŒã倿ŽããŸãã
éèŠïŒHomekitã§ã«ã¡ã©ãæ£ãã衚瀺ããã«ã¯ããã©ã¡ãŒã¿ãŒã®çµã¿åãããéåžžã«éèŠã§ãããã«ã¡ã©ãšã¹ããªãŒã ã«äŸåããŸãã ãŸããã·ã¹ãã ã®ããã©ãŒãã³ã¹ã«ã圱é¿ããŸãã ffmpegã®å®è¡äžã®ããã»ã¹ã¯å€ãã®ãªãœãŒã¹ãæ¶è²»ããŸãã
ããŒãã¹
ããŒãã¹ãšããŠãã«ã¡ã©ãããŒããã£ã¹ãã®ç°åžžãªäœ¿çšã«ã€ããŠèª¬æããŸãã
ã«ã¡ã©ã®ä»£ããã«åãffmpegã䜿çšããŠãç»åãç»åããããŒããã£ã¹ãã§ããŸãã ãããã®åçã¯ããããªã¹ããªãŒã ãšçµã¿åãããããšãã§ããŸãã ç»åã«ããã¹ããã°ã©ãã£ãã¯ã¹ãããã³ãã®ä»ã®æ å ±ã衚瀺ã§ããŸãã
ãã®çµæãè峿·±ãããã·ã¥ããŒããååŸã§ããŸãã ãŸãã宿çã«ç»åãæŽæ°ãããšãåçããŒã¿ãåŸãããŸãã
äŸãšããŠãåçïŒãã£ã¹ã¯äžã®ãã¡ã€ã«ïŒã®åœ¢ã§ããã€ãã®ã€ã³ãžã±ãŒã¿ãŒã®å€åã®ã°ã©ããåºããŸããã ãã®ã°ã©ãã¯1åéã«1åæŽæ°ããããã¡ã€ã«å ã®ç»åãäžæžãããŸãã
åçã®åœ¢ã§ã°ã©ããååŸããæ¹æ³ã説æããŸãã
IoBrokerã«ã¯ãã°ã©ããäœæããæšæºçãªæ¹æ³ã§ããFlotãã©ã€ããŒããããŸãã ãã®ãã©ã€ããŒã¯Webãã©ã€ããŒãšãã¢ã«ãªã£ãŠããããã©ãŠã¶ãŒã«çµæã衚瀺ããŸãã ãã ããäœæãããã°ã©ãããµãŒããŒäžïŒã¹ã¯ãªããå ïŒã§ç»åãšããŠååŸããã«ã¯ã远å ã®PhantomJSãã©ã€ããŒãå¿ èŠã§ãããã®ãã©ã€ããŒã¯ãããŒãžã®ãã¹ã¯ãªãŒã³ã·ã§ãããïŒFlotã°ã©ããæç»ããïŒãååŸããŸãã
ãã ããã¹ã¯ãªããã䜿çšããŠãµãŒããŒäžã§ã°ã©ããäœæããå¥ã®æ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã®ãããªChart.jsã©ã€ãã©ãªhttp://www.chartjs.org/ããããããã䜿çšãããšããã©ãŠã¶ã§èŠæ ãã®è¯ãã°ã©ãã£ãã¯ãæç»ã§ããŸãïŒäŸhttp://www.chartjs.org/samples/latest/ ïŒã
æç»ã«ã¯ããã©ãŠã¶ã®ããã£ã³ãã¹ãïŒãã£ã³ãã¹ïŒã䜿çšããŸãã ãããã£ãŠããµãŒããŒã§ãã®ã©ã€ãã©ãªã䜿çšããŠæç»ããã«ã¯ãããµãŒããŒãããŒãžã§ã³ã®ããã£ã³ãã¹ããªããžã§ã¯ããšDOMãªããžã§ã¯ãã䜿çšããå¿ èŠããããŸãã ãããchartjs-nodeããã±ãŒãžã®æ©èœã§ãïŒ https://github.com/vmpowerio/chartjs-node ïŒã
ãã®ããã±ãŒãžã®äž»ãªäŸåé¢ä¿ã¯ããã£ã³ãã¹ããã±ãŒãžïŒ https://github.com/Automattic/node-canvas ïŒã§ãããã°ããŒãã«ïŒãŸãã¯iobrokerãã©ã«ããŒïŒã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã https://github.com/Automattic/node-canvas#compilingãé 眮ãããã©ãããã©ãŒã ã®ãã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããšãéèŠã§ãã
ãã®åŸãchart.jsãchartjs-nodeã¢ãžã¥ãŒã«ãjavascriptãã©ã€ããŒèšå®ã«è¿œå ã§ããŸãã ãšã©ãŒãªãã§æ£ããã€ã³ã¹ããŒã«ãããã¯ãã§ãã ãã以å€ã®å Žåã¯ããšã©ãŒãåŠçããŠè§£æ±ºããŸãã
ãããŠãã¹ã¯ãªãããæžãããšãã§ããŸãã
以äžã¯ãäŸã®ã¹ã¯ãªããã§ãã ããã«ã¯ãå±¥æŽãã©ã€ããŒã®äœ¿çšãå«ãŸããç¹å®ã®ç¶æ åã䜿çšãããŸãã
泚æïŒ ã¹ã¯ãªããã«ã¯ãåå¿è åãã®è€éãªæ§é ããããŸã-Promise ããã¯ãã³ãŒã«ããã¯ã䜿çšããŠé¢æ°ãäœæããã®ã§ã¯ãªããã¹ãããã®ãã§ãŒã³ãäœæãã䟿å©ãªæ¹æ³ã§ãã ãããã£ãŠãããšãã°ããããå®è¡ããŠç¶æ å±¥æŽããããŒã¿ãååŸãããšäŸ¿å©ã§ãã
'use strict'; const ChartjsNode = require('chartjs-node'); /** * sendTo Promise, */ function sendToPromise(adapter, cmd, params) { return new Promise((resolve, reject) => { sendTo(adapter, cmd, params, (result) => { resolve(result); }); }); } // const chartColors = { black: 'rgb(0, 0, 0)', red: 'rgb(255, 99, 132)', orange: 'rgb(255, 159, 64)', yellow: 'rgb(255, 205, 86)', green: 'rgb(75, 192, 192)', blue: 'rgb(54, 162, 235)', purple: 'rgb(153, 102, 255)', grey: 'rgb(201, 203, 207)' }; /** * * : * @param config - * @param filename - * : * @param Promise - */ function doDraw(config, filename) { // 640x480 var chartNode = new ChartjsNode(640, 480); return chartNode.drawChart(config) .then(() => { // return chartNode.writeImageToFile('image/png', filename); }); } /** * ChartJS. * : * @param Promise - */ function prepareDraw0(){ // , var ; // Promise return new Promise((resolve, reject)=>{resolve()}) // , .then(()=>{ // , , = [ {"val":3,"ack":1,"ts":1539063874301}, {"val":5,"ack":1,"ts":1539063884299}, {"val":5.3,"ack":1,"ts":1539063894299}, {"val":3.39,"ack":1,"ts":1539063904301}, {"val":5.6,"ack":1,"ts":1539063914300}, {"val":-1.3,"ack":1,"ts":1539063924300}, {"val":-6.3,"ack":1,"ts":1539063934302}, {"val":1.23,"ack":1,"ts":1539063944301}, ]; }) // - .then(()=>{ const chartJsOptions = { // - type: 'line', data: { // datasets: [ { // label: '', // backgroundColor: chartColors.black, borderColor: chartColors.black, // pointRadius: 3, // borderWidth: 3, // '' data: .map((item) => { return {y: item.val, t: new Date(item.ts)} }), // - fill: false, } ] }, options: { // legend: { labels: { // fontSize: 20, }, }, // scales: { // X xAxes: [{ // - type: 'time', display: true, // scaleLabel: { display: true, labelString: '' }, }], // Y yAxes: [{ // - type: 'linear', display: true, // scaleLabel: { display: true, labelString: '' }, }] } } }; return chartJsOptions; }); } /** * ChartJS. * , * . * * : * @param hours - , * : * @param Promise - */ function prepareDraw1(hours){ // , const end = new Date().getTime(), start = end - 3600000*(hours || 1); // 1 = // , // var , 2, 1, 2, 2; // Promise return new Promise((resolve, reject)=>{resolve()}) // 'mqtt.0.ESP_Easy..Temperature' .then(() => { return sendToPromise('history.0', 'getHistory', { id: 'mqtt.0.ESP_Easy..Temperature', options: { start: start, end: end, aggregate: 'onchange' } } ).then((result) => { // '' = result.result; }); }) // 'sonoff.0.chicken2.DS18B20_Temperature' .then(() => { return sendToPromise('history.0', 'getHistory', { id: 'sonoff.0.chicken2.DS18B20_Temperature', options: { start: start, end: end, aggregate: 'onchange' } }).then((result)=>{ // '2' 2 = result.result; }); }) .then(() => { return sendToPromise('history.0', 'getHistory', { id: 'sonoff.0.sonoff_chicken_vent.DS18B20_Temperature', options: { start: start, end: end, aggregate: 'onchange' } }).then((result)=>{ 1 = result.result; }); }) .then(() => { return sendToPromise('history.0', 'getHistory', { id: 'sonoff.0.chicken2.POWER1', options: { start: start, end: end, aggregate: 'onchange' } }).then((result)=>{ 2 = result.result; }); }) .then(() => { return sendToPromise('history.0', 'getHistory', { id: 'sonoff.0.chicken2.POWER2', options: { start: start, end: end, aggregate: 'onchange' } }).then((result)=>{ 2 = result.result; }); }) // - .then(()=>{ const chartJsOptions = { // - type: 'line', data: { // datasets: [ { // label: ' ('+[.length - 1].val+')', // backgroundColor: chartColors.blue, borderColor: chartColors.blue, // . 0 - pointRadius: 0, // borderWidth: 3, // '' data: .map((item) => { return {y: item.val, t: new Date(item.ts)} }), // - fill: false, // Y yAxisID: 'y-axis-1', },{ label: ' 1 ('+1[1.length - 1].val+')', backgroundColor: chartColors.green, borderColor: chartColors.green, pointRadius: 0, borderWidth: 3, data: 1.map((item) => { return {y: item.val, t: new Date(item.ts)} }), fill: false, yAxisID: 'y-axis-1', },{ label: ' 2 ('+2[2.length - 1].val+')', backgroundColor: chartColors.red, borderColor: chartColors.red, pointRadius: 0, borderWidth: 3, data: 2.map((item) => { return {y: item.val, t: new Date(item.ts)} }), fill: false, yAxisID: 'y-axis-1', },{ label: ' 2 ('+2[2.length - 1].val+')', backgroundColor: chartColors.yellow, borderColor: chartColors.yellow, pointRadius: 0, borderWidth: 1, data: 2.map((item) => { return {y: (item.val) ? 1 : 0, t: new Date(item.ts)} }), fill: true, lineTension: 0, steppedLine: true, yAxisID: 'y-axis-2', },{ label: ' 2 ('+2[2.length - 1].val+')', backgroundColor: chartColors.grey, borderColor: chartColors.grey, pointRadius: 0, borderWidth: 1, data: 2.map((item) => { return {y: (item.val) ? -1 : 0, t: new Date(item.ts)} }), fill: true, lineTension: 0, steppedLine: true, yAxisID: 'y-axis-2', } ] }, options: { // legend: { labels: { // fontSize: 20, }, }, // scales: { // X xAxes: [{ // - type: 'time', display: true, // scaleLabel: { display: true, labelString: '' }, // () time: { unit: 'minute', displayFormats: { minute: 'HH:mm' } }, }], // Y yAxes: [{ // - type: 'linear', display: true, // scaleLabel: { display: true, labelString: '' }, // - position: 'left', // id: 'y-axis-1', },{ type: 'linear', display: true, scaleLabel: { display: true, labelString: ' ' }, ticks: { min: -4, max: 2 }, // - position: 'right', id: 'y-axis-2', }] } } }; return chartJsOptions; }); } function createImage(filename, callback){ // filename - , // prepareDraw1(2) // .then((result) => { // return doDraw(result, filename); }) .then(()=>{ if (callback) callback(); }) .catch((err)=>{ console.error(err); }); }
ãµã ãã€ã«ç»åã¯çŽ1åã«1åæŽæ°ãããããã10ç§ããšã«æŽæ°ãããããã«ç»åãèšå®ããŸãã
var fs = require('fs'); // 10 schedule("*/10 * * * * *", () => { createImage1('/tmp/1_new.jpg', ()=> { fs.renameSync('/tmp/1_new.jpg', '/tmp/1.jpg'); }); createImage2('/tmp/2_new.jpg', ()=> { fs.renameSync('/tmp/2_new.jpg', '/tmp/2.jpg'); }); });
ç¹æ®ãªç¹ã¯ãç»åããããŒããã£ã¹ãããããã»ã¹ã§ãffmpegãã¯ã©ãã·ã¥ããªãããã«ç»åãååã«è¿ éã«çœ®ãæããå¿ èŠãããããšã§ã:)ãããã£ãŠãç»åã¯æåã«1ã€ã®ãã¡ã€ã«ã«åœ¢æãããæ¬¡ã«ãã¡ã€ã«ã¯ç¿»èš³ã«äœ¿çšããããã¡ã€ã«ã«ååã倿ŽãããŸãã
ããã§ãã«ã¡ã©ã®èšå®ã§ãã¹ããªãŒã ã¢ãã¬ã¹ã®ä»£ããã«çæããããã¡ã€ã«ã®ååãæå®ããç»åããæŽæ°ããããèšå®ïŒãã©ã¡ãŒã¿ãŒã-loop 1ãïŒã远å ããŸãã ããã¯ãã«ã¡ã©ã®è©³çްããããã£ã§æ§æãããŸãã ãããã®ããããã£ã¯ãffmpegãå®è¡ããããã®ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã«ãããŸããã ãããã£ãŠãffmpegã®ããã¥ã¡ã³ããšäŸã§ãã©ã¡ãŒã¿ãŒã®çµã¿åãããèŠã€ããå¿ èŠããããŸãã
ããããã£ã¯ãããã¬ãã¥ãŒãïŒå°ããªã«ã¡ã©ç»åïŒãååŸãããããšãããŒããã£ã¹ãããããã®2çš®é¡ã«åããããŸãã ãããã£ãŠãããšãã°ç°ãªã詳现ã§ãç°ãªãç»åãœãŒã¹ãã¡ã€ã«ãæå®ã§ããŸãã
ãããã«
ããã€ã¹ãšãµãŒãããŒãã£ã®ãµãŒãã¹ãioBrokerã·ã¹ãã ã«çµ±åãããšãããããã¯ã¯éåžžã«æ·±ããåçŽã§ã¯ãããŸããããã©ã°ã€ã³ã®äœæè ã¯çµ±åããã»ã¹ãç°¡çŽ åããããšããŸãããå Žåã«ãã£ãŠã¯è¿œå ã®ããžãã¯ãèšè¿°ããå¿ èŠããããŸãããããããã®ãããªæè»æ§ã®ãããã§ãã»ãŒãã¹ãŠã®ããã€ã¹ããã³ãµãŒãã¹ãšã®çµ±åãå¯èœã§ãã
Yahkaãã©ã€ããŒã®éçºè ã¯ãMaterialãã©ã€ããŒã§è¡ãããŠããããã«ãåªåããŠããã€ã¹ã®èªåæ€åºã远å ããããšãæãŸããŸãããã®å Žåãç¶æ ã®åœ¹å²ãšæ©èœã瀺ãå¿ èŠãããããã©ã€ããŒã¯HomeKitã®ã²ãŒããŠã§ã€æ§æã«é©åãªããã€ã¹ã远å ããããšãææ¡ããå¿ èŠããããŸãã
Yahka, HomeKit â Ham, HomeBridge . ããããããã¯å¥ã®èšäºã®ãããã¯ã§ãã