{"id":2739,"date":"2023-11-16T13:21:12","date_gmt":"2023-11-16T04:21:12","guid":{"rendered":"https:\/\/uda2.com\/blog\/?p=2739"},"modified":"2023-11-16T13:21:12","modified_gmt":"2023-11-16T04:21:12","slug":"homekitre","status":"publish","type":"post","link":"https:\/\/uda2.com\/blog\/homekitre\/","title":{"rendered":"Raspberry Pi\u3067\u5148\u53d6\u308aHomekit \u65b0"},"content":{"rendered":"\n<p>\u5148\u65e5\u30a6\u30c1\u306e\u30db\u30fc\u30e0\u30b5\u30fc\u30d0\u30fc\uff08Raspberrypi4\uff09\u306bnode.js\u3092\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3059\u308b\u3068\u53cd\u5fdc\u3057\u306a\u304f\u306a\u308b\u554f\u984c\u3092\u89e3\u6c7a\u3059\u3079\u304f\u534a\u65e5\u8a66\u884c\u932f\u8aa4\u3057\u305f\u3042\u3052\u304fapt\u304c\u52d5\u304b\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u3001\u4ed5\u65b9\u306a\u304fOS\u306e\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u4e8b\u3068\u306a\u308a\u307e\u3057\u305f\u3002<br>Raspbian\u306fwheezy\uff087\uff09\u304b\u3089bullseye\uff0811\uff09\u307e\u3067\u306f\u9806\u7e70\u308a\u4f7f\u3063\u3066\u305f\u3051\u3069\u3001\u30db\u30fc\u30e0\u30b5\u30fc\u30d0\u30fc\u306b\u306fbuster\uff0810\uff09\u3092\u5165\u308c\u3066\u305f\u306e\u3067\u6700\u65b0\u306eBookworm\uff0812\uff09\u306b\u3059\u308b\u3068\u4e8c\u4e16\u4ee3\u9055\u3046\u306e\u3067\u5404\u6240\u3067\u8272\u3005\u3068\u9055\u3044\u304c\u3042\u308a\u624b\u3053\u305a\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u6295\u7a3f\u3057\u305f<a href=\"https:\/\/uda2.com\/blog\/homekitxx\/\" target=\"_blank\" rel=\"noreferrer noopener\">Raspberry Pi\u3067\u5148\u53d6\u308aHomekit \u8ffd\u8a18<\/a>\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3082\u4f7f\u3048\u306a\u304f\u306a\u3063\u305f\u306e\u3067\u4fee\u6b63\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Python\u306f\u672a\u3060\u306b\u3042\u307e\u308a\u89e6\u3063\u3066\u7121\u3044\u306e\u3067\u4e0b\u306e\u3088\u3046\u306bChatGPT\u306b\u6295\u3052\u305f\u3089\u4fee\u6b63\u3057\u305f\u30b3\u30fc\u30c9\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3057\u305f\u3002<br>\u300c<strong>\u4e0b\u8a18\u306e\u30b3\u30fc\u30c9\u3092python3\u3067\u3082\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u4fee\u6b63\u3057\u3066\u4e0b\u3055\u3044\u3002<\/strong>\u300d<br>\u53b3\u5bc6\u306b\u306f\u5168\u3066\u306e\u554f\u984c\u70b9\u3092\u4fee\u6b63\u306f\u3057\u3066\u304f\u308c\u306a\u304b\u3063\u305f\u306e\u3067\u76f4\u3063\u3066\u306f\u306a\u3044\u306e\u3067\u3059\u304c\u540c\u69d8\u306b\u5909\u66f4\u70b9\u3092\u5168\u3066\u53cd\u6620\u3059\u308b\u3068\u76f4\u3059\u3068\u52d5\u4f5c\u3057\u307e\u3057\u305f\u3002<br>\u8272\u3005\u4fee\u6b63\u3057\u3066\u304f\u308c\u305f\u306e\u3067\u3059\u304c\u52d5\u4f5c\u3057\u306a\u3044\u554f\u984c\u306f\u300c\u4e3b\u306a\u5909\u66f4\u70b9\u300d\u3068\u3057\u3066ChatGPT\u304c\u66f8\u3044\u3066\u304f\u308c\u305f\u300c<strong>ir_serial.write \u306e\u5f15\u6570\u3092 bytes \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u5909\u66f4\u3057\u307e\u3057\u305f\u3002<\/strong>\u300d\u304c\u539f\u56e0\u3067\u3057\u305f\u3002<br>\u5177\u4f53\u7684\u306b\u306f<br>\u300c<strong>ir_serial.write(&#8220;I,1\\r\\n&#8221;)<\/strong>\u300d\u3092\u300c<strong>ir_serial.write(b&#8221;I,1\\r\\n&#8221;)<\/strong>\u300d\u306b\u3057\u305f\u308a<br>\u300c<strong>ir_serial.write(&#8220;n,%d\\r\\n&#8221; % recNumber)<\/strong>\u300d\u3092\u300c<strong>ir_serial.write((&#8220;n,%d\\r\\n&#8221; % recNumber).encode())<\/strong>\u300d<br>\u306b\u3059\u308b\u611f\u3058\u3067\u4fee\u6b63\u6f0f\u308c\u3092\u57cb\u3081\u308b\u3068\u52d5\u4f5c\u3057\u307e\u3057\u305f\u306e\u3067\u518d\u63b2\u8f09\u3055\u305b\u3066\u9802\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>$ vi ~\/.homebridge\/data\/irm.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -*- coding: utf-8 -*-\n\nimport sys\nimport serial\nimport time\nimport json\nimport argparse\nimport os\n\nhere = os.path.abspath(os.path.dirname(__file__))\n#ir_serial = serial.Serial(\"\/dev\/ttyACM0\", 9600, timeout = 1)\n#ir_serial = serial.Serial(\"\/dev\/tty.usbmodem01231\", 9600, timeout = 1)\n\ndef captureIR(path):\n  ir_serial = serial.Serial(\"\/dev\/ttyACM0\", 9600, timeout = 1)\n  print(\"Capturing IR...\")\n  ir_serial.write(b\"c\\r\\n\")\n  time.sleep(3.0)\n  msg = ir_serial.readline().decode()\n  print(msg)\n  if path and not 'Time Out' in msg:\n    saveIR(path, ir_serial)\n  ir_serial.close()\n\ndef playIR(path,delay):\n  time.sleep(delay)\n  ir_serial = serial.Serial(\"\/dev\/ttyACM0\", 9600, timeout = 1)\n  if path and os.path.isfile(path):\n    print(\"Playing IR with %s ...\" % path)\n    f = open(path)\n    data = json.load(f)\n    f.close()\n    recNumber = len(data&#91;'data'])\n    rawX = data&#91;'data']\n\n    ir_serial.write((\"n,%d\\r\\n\" % recNumber).encode())\n    ir_serial.readline()\n\n    postScale = data&#91;'postscale']\n    ir_serial.write((\"k,%d\\r\\n\" % postScale).encode())\n    #time.sleep(1.0)\n    msg = ir_serial.readline()\n    #print msg\n\n    for n in range(recNumber):\n        bank = n \/\/ 64\n        pos = n % 64\n        if (pos == 0):\n          ir_serial.write((\"b,%d\\r\\n\" % bank).encode())\n\n        ir_serial.write((\"w,%d,%d\\n\\r\" % (pos, rawX&#91;n])).encode())\n\n    ir_serial.write(b\"p\\r\\n\")\n    msg = ir_serial.readline().decode()\n    print(msg)\n    #ir_serial.close()\n  else:\n    print(\"Playing IR...\")\n    ir_serial.write(b\"p\\r\\n\")\n    time.sleep(1.0)\n    msg = ir_serial.readline().decode()\n    print(msg)\n  ir_serial.close()\n\ndef saveIR(path):\n  ir_serial = serial.Serial(\"\/dev\/ttyACM0\", 9600, timeout = 1)\n  print (\"Saving IR data to %s ...\" % path)\n  rawX = &#91;]\n  ir_serial.write(b\"I,1\\r\\n\")\n  time.sleep(1.0)\n  recNumberStr = ir_serial.readline()\n  recNumber = int(recNumberStr, 16).decode()\n\n  ir_serial.write(b\"I,6\\r\\n\")\n  time.sleep(1.0)\n  postScaleStr = ir_serial.readline().decode()\n  postScale = int(postScaleStr, 10)\n\n  #for n in range(640):\n  for n in range(recNumber):\n      bank = n \/\/ 64\n      pos = n % 64\n      if (pos == 0):\n          ir_serial.write((\"b,%d\\r\\n\" % bank).encode())\n\n      ir_serial.write((\"d,%d\\n\\r\" % pos).encode())\n      xStr = ir_serial.read(3).decode()\n      xData = int(xStr, 16)\n      rawX.append(xData)\n\n  data = {'format':'raw', 'freq':38, 'data':rawX, 'postscale':postScale}\n\n  f = open(path, 'w')\n  json.dump(data, f)\n  f.close()\n  print(\"Done !\")\n  ir_serial.close()\n\nif __name__ == \"__main__\":\n  # parse options\n  parser = argparse.ArgumentParser(description='irMagician CLI utility.')\n  parser.add_argument('-c', '--capture', action=\"store_true\", dest=\"cap\", help=\"capture IR data\", default=False)\n  parser.add_argument('-p', '--play', action=\"store_true\", dest=\"play\", help=\"play IR data\", default=False)\n  parser.add_argument('-d', '--delay', dest=\"delay\", help=\"delay for play\", type=float, default=0)\n  parser.add_argument('-s', '--save', action=\"store_true\", dest=\"save\", help=\"save IR data\", default=False)\n  parser.add_argument('-f', '--file', action=\"store\", dest=\"file\", help=\"IR data file (json)\", default=False)\n\n  args = parser.parse_args()\n\n  if args.play:\n    playIR(args.file,args.delay)\n\n  if args.save and args.file:\n    saveIR(args.file)\n\n  if args.cap:\n    captureIR(args.file)\n\n  # release resources\n  #ir_serial.close()<\/code><\/pre>\n\n\n\n<p>\u8a73\u3057\u3044\u8a2d\u7f6e\u65b9\u6cd5\u306f\u4e0b\u8a18\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/uda2.com\/blog\/homekit1\/\">Raspberry Pi\u3067\u5148\u53d6\u308aHomekit Vol.1<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/uda2.com\/blog\/homekit2\/\">Raspberry Pi\u3067\u5148\u53d6\u308aHomekit Vol.2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/uda2.com\/blog\/homekit3\/\">Raspberry Pi\u3067\u5148\u53d6\u308aHomekit Vol.3<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/uda2.com\/blog\/homekitxx\/\">Raspberry Pi\u3067\u5148\u53d6\u308aHomekit \u8ffd\u8a18<\/a><\/li>\n<\/ul>\n\n\n\n<p>\u3000<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5148\u65e5\u30a6\u30c1\u306e\u30db\u30fc\u30e0\u30b5\u30fc\u30d0\u30fc\uff08Raspberrypi4\uff09\u306bnode.js\u3092\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3059\u308b\u3068\u53cd\u5fdc\u3057\u306a\u304f\u306a\u308b\u554f\u984c\u3092\u89e3\u6c7a\u3059\u3079\u304f\u534a\u65e5\u8a66\u884c\u932f\u8aa4\u3057\u305f\u3042\u3052\u304fapt\u304c\u52d5\u304b\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u3001\u4ed5\u65b9\u306a\u304fOS\u306e\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u4e8b\u3068\u306a\u308a\u307e\u3057\u305f<\/p>\n","protected":false},"author":2,"featured_media":2745,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[205],"tags":[328,327,329],"class_list":["post-2739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-creatorsdiary","tag-homekit","tag-raspberry-pi","tag-siri"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/posts\/2739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/comments?post=2739"}],"version-history":[{"count":6,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/posts\/2739\/revisions"}],"predecessor-version":[{"id":2746,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/posts\/2739\/revisions\/2746"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/media\/2745"}],"wp:attachment":[{"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/media?parent=2739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/categories?post=2739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uda2.com\/blog\/wp-json\/wp\/v2\/tags?post=2739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}