{"id":600,"date":"2021-10-08T09:40:07","date_gmt":"2021-10-08T00:40:07","guid":{"rendered":"https:\/\/rfsec.ddns.net\/db\/?p=600"},"modified":"2022-02-21T12:07:20","modified_gmt":"2022-02-21T03:07:20","slug":"%e3%82%bb%e3%83%b3%e3%82%b5%e3%83%bc%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92influxdb%e3%81%b8%e9%80%81%e3%82%8b","status":"publish","type":"post","link":"https:\/\/rfsec.ddns.net\/db\/?p=600","title":{"rendered":"\u30bb\u30f3\u30b5\u30fc\u306e\u30c7\u30fc\u30bf\u3092influxdb\u3078\u9001\u308b"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"python\u7248\">python\u7248<\/h2>\n\n\n\n<p><a href=\"https:\/\/densi.biz\/bme280\" data-type=\"URL\" data-id=\"https:\/\/densi.biz\/bme280\" target=\"_blank\" rel=\"noreferrer noopener\">\u53c2\u8003URL\uff08\u30e9\u30ba\u30d1\u30a4+BME280\u3067\u6e29\u5ea6\u30fb\u6e7f\u5ea6\u30fb\u6c17\u5727\u3092\u8a08\u6e2c\uff08BMP280\u306f\u6e7f\u5ea6\u306a\u3057\uff09<\/a><\/p>\n\n\n\n<p>\u6b21\u306epython\u30b3\u30fc\u30c9\u3092cron\u3067\u5b9a\u671f\u7684\uff08\u4f8b\u3048\u30703\u5206\u6bce\uff09\u306b\u5b9f\u884c\u3057\u3001influxdb\u306e\u30db\u30b9\u30c8\u3078\u9001\u4fe1\u3059\u308b\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>#coding: utf-8\n#encoding: utf-8\n\nfrom influxdb import InfluxDBClient\nclient = InfluxDBClient(host=&#39;xxx.xxx.xxx.xxx&#39;, port=8086, username=&#39;****&#39;, password=&#39;****&#39;, database=&#39;iot01&#39;)\nmeasurement = &#39;air5&#39;\ntags = {&#39;place&#39;: &#39;leaf-bme280&#39;,&#39;host&#39;: &#39;RockPi4&#39;}\n\nfrom smbus2 import SMBus\nimport time\n\nbus_number  = 7 # RockPi4\u306e\u5834\u5408\u3002 Raspi\u3067\u306f 1\ni2c_address = 0x76\n\nbus = SMBus(bus_number)\n\ndigT = []\ndigP = []\ndigH = []\n\nt_fine = 0.0\n\ndef writeReg(reg_address, data):\n        bus.write_byte_data(i2c_address,reg_address,data)\n\ndef get_calib_param():\n        calib = []\n\n        for i in range (0x88,0x88+24):\n                calib.append(bus.read_byte_data(i2c_address,i))\n        calib.append(bus.read_byte_data(i2c_address,0xA1))\n        for i in range (0xE1,0xE1+7):\n                calib.append(bus.read_byte_data(i2c_address,i))\n\n        digT.append((calib[1] &lt;&lt; 8) | calib[0])\n        digT.append((calib[3] &lt;&lt; 8) | calib[2])\n        digT.append((calib[5] &lt;&lt; 8) | calib[4])\n        digP.append((calib[7] &lt;&lt; 8) | calib[6])\n        digP.append((calib[9] &lt;&lt; 8) | calib[8])\n        digP.append((calib[11]&lt;&lt; 8) | calib[10])\n        digP.append((calib[13]&lt;&lt; 8) | calib[12])\n        digP.append((calib[15]&lt;&lt; 8) | calib[14])\n        digP.append((calib[17]&lt;&lt; 8) | calib[16])\n        digP.append((calib[19]&lt;&lt; 8) | calib[18])\n        digP.append((calib[21]&lt;&lt; 8) | calib[20])\n        digP.append((calib[23]&lt;&lt; 8) | calib[22])\n        digH.append( calib[24] )\n        digH.append((calib[26]&lt;&lt; 8) | calib[25])\n        digH.append( calib[27] )\n        digH.append((calib[28]&lt;&lt; 4) | (0x0F & calib[29]))\n        digH.append((calib[30]&lt;&lt; 4) | ((calib[29] &gt;&gt; 4) & 0x0F))\n        digH.append( calib[31] )\n\n        for i in range(1,2):\n                if digT[i] & 0x8000:\n                        digT[i] = (-digT[i] ^ 0xFFFF) + 1\n\n        for i in range(1,8):\n                if digP[i] & 0x8000:\n                        digP[i] = (-digP[i] ^ 0xFFFF) + 1\n\n        for i in range(0,6):\n                if digH[i] & 0x8000:\n                        digH[i] = (-digH[i] ^ 0xFFFF) + 1\n\ndef readData():\n        data = []\n        for i in range (0xF7, 0xF7+8):\n                data.append(bus.read_byte_data(i2c_address,i))\n        pres_raw = (data[0] &lt;&lt; 12) | (data[1] &lt;&lt; 4) | (data[2] &gt;&gt; 4)\n        temp_raw = (data[3] &lt;&lt; 12) | (data[4] &lt;&lt; 4) | (data[5] &gt;&gt; 4)\n        hum_raw  = (data[6] &lt;&lt; 8)  |  data[7]\n\n        temp = compensate_T(temp_raw)\n        pres = compensate_P(pres_raw)\n        humi = compensate_H(hum_raw)\n        print (round(temp,2))\n        print (round(pres,2))\n        print (round(humi,2))\n        json_body = [\n                {\n                        &#39;measurement&#39;: measurement,\n                        &#39;tags&#39;: tags,\n                        &#39;fields&#39;: {&#39;temp&#39;: round(temp,2) , &#39;humi&#39;: round(humi,2) , &#39;hpa&#39;: round(pres,2)}\n                }\n        ]\n        client.write_points(json_body)\n        print(json_body)\n\n\ndef compensate_P(adc_P):\n        global  t_fine\n        pressure = 0.0\n\n        v1 = (t_fine \/ 2.0) - 64000.0\n        v2 = (((v1 \/ 4.0) * (v1 \/ 4.0)) \/ 2048) * digP[5]\n        v2 = v2 + ((v1 * digP[4]) * 2.0)\n        v2 = (v2 \/ 4.0) + (digP[3] * 65536.0)\n        v1 = (((digP[2] * (((v1 \/ 4.0) * (v1 \/ 4.0)) \/ 8192)) \/ 8)  + ((digP[1] * v1) \/ 2.0)) \/ 262144\n        v1 = ((32768 + v1) * digP[0]) \/ 32768\n\n        if v1 == 0:\n                return 0\n        pressure = ((1048576 - adc_P) - (v2 \/ 4096)) * 3125\n        if pressure &lt; 0x80000000:\n                pressure = (pressure * 2.0) \/ v1\n        else:\n                pressure = (pressure \/ v1) * 2\n        v1 = (digP[8] * (((pressure \/ 8.0) * (pressure \/ 8.0)) \/ 8192.0)) \/ 4096\n        v2 = ((pressure \/ 4.0) * digP[7]) \/ 8192.0\n        pressure = pressure + ((v1 + v2 + digP[6]) \/ 16.0)\n\n        return (pressure\/100)\n        #print &quot;pressure : %7.2f hPa&quot; % (pressure\/100)\n\ndef compensate_T(adc_T):\n        global t_fine\n        v1 = (adc_T \/ 16384.0 - digT[0] \/ 1024.0) * digT[1]\n        v2 = (adc_T \/ 131072.0 - digT[0] \/ 8192.0) * (adc_T \/ 131072.0 - digT[0] \/ 8192.0) * digT[2]\n        t_fine = v1 + v2\n        temperature = t_fine \/ 5120.0\n\n        return temperature\n        #print &quot;temp : %-6.2f \u2103&quot; % (temperature)\n\ndef compensate_H(adc_H):\n        global t_fine\n        var_h = t_fine - 76800.0\n        if var_h != 0:\n                var_h = (adc_H - (digH[3] * 64.0 + digH[4]\/16384.0 * var_h)) * (digH[1] \/ 65536.0 * (1.0 + digH[5] \/ 67108864.0 * var_h * (1.0 + digH[2] \/ 67108864.0 * var_h)))\n        else:\n                return 0\n        var_h = var_h * (1.0 - digH[0] * var_h \/ 524288.0)\n        if var_h &gt; 100.0:\n                var_h = 100.0\n        elif var_h &lt; 0.0:\n                var_h = 0.0\n\n        return var_h\n        #print &quot;hum : %6.2f \uff05&quot; % (var_h)\n\ndef setup():\n        osrs_t = 1                      #Temperature oversampling x 1\n        osrs_p = 1                      #Pressure oversampling x 1\n        osrs_h = 1                      #Humidity oversampling x 1\n        mode   = 3                      #Normal mode\n        t_sb   = 5                      #Tstandby 1000ms\n        filter = 0                      #Filter off\n        spi3w_en = 0                    #3-wire SPI Disable\n\n        ctrl_meas_reg = (osrs_t &lt;&lt; 5) | (osrs_p &lt;&lt; 2) | mode\n        config_reg    = (t_sb &lt;&lt; 5) | (filter &lt;&lt; 2) | spi3w_en\n        ctrl_hum_reg  = osrs_h\n\n        writeReg(0xF2,ctrl_hum_reg)\n        writeReg(0xF4,ctrl_meas_reg)\n        writeReg(0xF5,config_reg)\n\nsetup()\nget_calib_param()\n\nif __name__ == &#39;__main__&#39;:\n        try:\n                readData()\n        except KeyboardInterrupt:\n                pass<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"golang\u7248\">Golang\u7248<\/h2>\n\n\n\n<p>\u53c2\u8003URL\u3000<a href=\"https:\/\/armoris.hatenablog.com\/entry\/2021\/02\/19\/163250\">Armoris\u65e5\u8a18 \u30e9\u30ba\u30d1\u30a4\u3068 BME280 \u3067\u6e29\u5ea6\u30fb\u6e7f\u5ea6\u30fb\u6c17\u5727\u3092\u6e2c\u3063\u3066 \u30b0\u30e9\u30d5\u5316\u3057\u3066\u8868<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/armoris.hatenablog.com\/entry\/2021\/02\/19\/163250\" target=\"_blank\">\u793a\u3059\u308b<\/a><\/p>\n\n\n\n<p><strong>Raspberry Pi4B 32biOS\u306e\u5834\u5408<\/strong><\/p>\n\n\n\n<p>$ uname -a<br>Linux ps2 5.10.63-v7l+ #1457 SMP Tue Sep 28 11:26:14 BST 2021 armv7l GNU\/Linux<\/p>\n\n\n\n<p>\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u6b21\u3092\u8a2d\u5b9a<\/p>\n\n\n\n<p>$ GOOS=linux &amp;&amp; GOARCH=arm &amp;&amp; GOARM=6<\/p>\n\n\n\n<p>const recordIntervalSec = 180\u3067\u3001\u30c7\u30fc\u30bf\u3092\u6295\u3052\u308b\u5468\u671f\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002(\u81ea\u5206\u306e\u74b0\u5883\u3067\u306f <strong>$HOME\/influx\/<\/strong>\u914d\u4e0b\u306b\u914d\u7f6e\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-git\" data-lang=\"Git\"><code>package main\n\nimport (\n    &quot;context&quot;\n    &quot;fmt&quot;\n    &quot;time&quot;\n\n    influxdb2 &quot;github.com\/influxdata\/influxdb-client-go\/v2&quot;\n    &quot;github.com\/influxdata\/influxdb-client-go\/v2\/api&quot;\n    &quot;github.com\/quhar\/bme280&quot;\n    &quot;golang.org\/x\/exp\/io\/i2c&quot;\n)\n\nfunc initBme280() (*bme280.BME280, error) {\n    d, err := i2c.Open(&i2c.Devfs{Dev: &quot;\/dev\/i2c-1&quot;}, 0x76) \/\/ 0x76\u306f\u4eca\u56de\u4f7f\u7528\u3059 \u308bBME280\u306eI2C\u30a2\u30c9\u30ec\u30b9\n    if err != nil {\n        return nil, err\n    }\n\n    b := bme280.New(d)\n    err = b.Init()\n    return b, err\n}\n\nfunc recordSensorValues(b *bme280.BME280, w api.WriteAPIBlocking, measurement string) (err error) {\n    t, p, h, err := b.EnvData()\n    if err != nil {\n        return\n    }\n    point := influxdb2.NewPoint(\n        measurement,\n        map[string]string{},\n        map[string]interface{}{\n            &quot;temperature&quot;: t,\n            &quot;humidity&quot;:    h,\n            &quot;pressure&quot;:    p,\n        },\n        time.Now(),\n    )\n    err = w.WritePoint(context.Background(), point)\n    if err != nil {\n        return\n    }\n    fmt.Printf(&quot;Temp: %.2fC, Hum: %.2f%%, Press: %.2fhpa\\n&quot;, t, h, p)\n    return\n}\n\nfunc main() {\n    const influxURL = &quot;http:\/\/xxx.xxx.xxx.xxx:8086&quot;      \/\/ InfluxDB API\u306eURL\n    const userName = &quot;*****&quot;                      \/\/ influxDB\u306eUser\u540d\n    const password = &quot;*****&quot;                       \/\/ influxDB\u306eUser\u306ePassword\n    const db = &quot;iot01&quot;                             \/\/ influxDB\u306eDatabase\n    const measurement = &quot;sensors&quot;                  \/\/ influxDB\u306eMeasurement(\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306f\u5b9f\u884c\u6642\u306b\u751f\u6210\u3055\u308c\u308b)\n    const recordIntervalSec = 180                  \/\/ \u5024\u3092\u66f8\u304d\u8fbc\u3080\u9593\u9694(\u79d2)\n\n    b, err := initBme280()\n    if err != nil {\n        panic(err)\n    }\n    c := influxdb2.NewClient(influxURL, fmt.Sprintf(&quot;%s:%s&quot;, userName, password))\n    w := c.WriteAPIBlocking(&quot;&quot;, db+&quot;\/autogen&quot;)\n\n    ticker := time.NewTicker(recordIntervalSec * time.Second)\n    defer ticker.Stop()\n    for {\n        select {\n        case &lt;-ticker.C:\n            err = recordSensorValues(b, w, measurement)\n            if err != nil {\n                panic(err)\n            }\n        }\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p><strong>RockPi4\u306764bit OS\u306e\u5834\u5408<\/strong><\/p>\n\n\n\n<p>$ uname -a<br>Linux rock 4.4.154-110-rockchip-gcef30e88a9f5 #1 SMP Mon Jun 22 07:37:10 UTC 2020 aarch64 aarch64 aarch64 GNU\/Linux<\/p>\n\n\n\n<p>apt\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305fgolang\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u53e4\u3044\u306e\u3067\u3001\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u53d6\u5f97<\/p>\n\n\n\n<p> $ GOOS=linux &amp;&amp; GOARCH=arm64 &amp;&amp; GOARM=6  \u3067\u30b3\u30f3\u30d1\u30a4\u30eb\u306f\u3067\u304d\u308b\u304c\u3001\u5b9f\u884c\u6642\u306b\u30a8\u30e9\u30fc\u3068\u306a\u308b\u3002(chip ID\u304c\u9055\u3046\u3088\uff01\u3000\u3068\u3044\u3046\u30a8\u30e9\u30fc\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>mars@rock:~\/influx$ ~\/go\/bin\/go build iot-sensor-logger.go\ngo: downloading github.com\/influxdata\/influxdb-client-go\/v2 v2.5.1\ngo: downloading golang.org\/x\/net v0.0.0-20210119194325-5f4716e94777\ngo: downloading github.com\/deepmap\/oapi-codegen v1.8.2\ngo: downloading github.com\/pkg\/errors v0.9.1\ngo: downloading gopkg.in\/yaml.v2 v2.3.0\ngo: downloading github.com\/influxdata\/line-protocol v0.0.0-20200327222509-2487e7298839\n\n$ .\/iot-sensor-logger\npanic: chip ID is different than expected, want(60), got(58)\n\ngoroutine 1 [running]:\nmain.main()\n        \/home\/mars\/influx\/iot-sensor-logger.go:58 +0x1bc<\/code><\/pre><\/div>\n\n\n\n<p>\u81ea\u5206\u306e\u74b0\u5883\u3067\u306f\u3001\u5b9f\u884c\u6642\u306b\u30a8\u30e9\u30fc\u3068\u306a\u3063\u3066\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u306a\u3044\u3002  GOARM=7\u3082\u8a66\u3057\u3066\u307f\u305f\u304cNG\u3002\u30b3\u30f3\u30d1\u30a4\u30eb\u3067\u751f\u6210\u3055\u308c\u305f\u30b3\u30fc\u30c9\u306e\u60c5\u5831\u306f\u3001\u554f\u984c\u306a\u3055\u305d\u3046\u306a\u306e\u3067\u3001\u53c2\u7167\u3057\u3066\u3044\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u306b\u554f\u984c\u304c\u3042\u308b\u306e\u304b\uff1f\uff1f\uff1f<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>$ file iot-sensor-logger\niot-sensor-logger: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter \/lib\/ld-linux-aarch64.so.1, not stripped<\/code><\/pre><\/div>\n\n\n\n<p>\u3061\u306a\u307f\u306b\u3001\u3010Golang\u3011\u304c\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b GOOS \u3068 GOARCH \u306e\u4e00\u89a7<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>$ go tool dist list\naix\/ppc64\nandroid\/386\nandroid\/amd64\nandroid\/arm\nandroid\/arm64\ndarwin\/amd64\ndarwin\/arm64\ndragonfly\/amd64\nfreebsd\/386\nfreebsd\/amd64\nfreebsd\/arm\nfreebsd\/arm64\nillumos\/amd64\nios\/amd64\nios\/arm64\njs\/wasm\nlinux\/386\nlinux\/amd64\nlinux\/arm\nlinux\/arm64\nlinux\/mips\nlinux\/mips64\nlinux\/mips64le\nlinux\/mipsle\nlinux\/ppc64\nlinux\/ppc64le\nlinux\/riscv64\nlinux\/s390x\nnetbsd\/386\nnetbsd\/amd64\nnetbsd\/arm\nnetbsd\/arm64\nopenbsd\/386\nopenbsd\/amd64\nopenbsd\/arm\nopenbsd\/arm64\nopenbsd\/mips64\nplan9\/386\nplan9\/amd64\nplan9\/arm\nsolaris\/amd64\nwindows\/386\nwindows\/amd64\nwindows\/arm\nwindows\/arm64<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>python\u7248 \u53c2\u8003URL\uff08\u30e9\u30ba\u30d1\u30a4+BME280\u3067\u6e29\u5ea6\u30fb\u6e7f\u5ea6\u30fb\u6c17\u5727\u3092\u8a08\u6e2c\uff08BMP280\u306f\u6e7f\u5ea6\u306a\u3057\uff09 \u6b21\u306epython\u30b3\u30fc\u30c9\u3092cron\u3067\u5b9a\u671f\u7684\uff08\u4f8b\u3048\u30703\u5206\u6bce\uff09\u306b\u5b9f\u884c\u3057\u3001influxdb\u306e\u30db\u30b9\u30c8\u3078\u9001\u4fe1\u3059\u308b\u3002 Golang\u7248 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-600","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"featured_image_src":null,"author_info":{"display_name":"mars","author_link":"https:\/\/rfsec.ddns.net\/db\/?author=1"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=600"}],"version-history":[{"count":6,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/600\/revisions"}],"predecessor-version":[{"id":867,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/600\/revisions\/867"}],"wp:attachment":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}