사물인터넷으로 쾌락식물을 찾다

실용성이 뒷전으로 밀리더라도 자동화 작업은 줄곧 사람을 끌어당긴다.팔꿈치 윤활제를 조금만 써도 이 정도는 할 수 있다는 것은 정말 불가사의하다.
지난 1년 동안 나는 최근에 집에서 식물을 돌보기 시작했다.대부분 채소다.그 동안 나는 내 식물을 어떻게 즐겁게 하는지에 관한 책을 많이 읽었다.한 가지 확실한 것은 1년의 끊임없는 보살핌을 거쳐도 나는 아무것도 모른다는 것이다😁. 그러나 이것이 바로 그것의 묘미이다. 항상 더 많은 것을 배워야 한다!
내 식물을 즐겁게 해 주는 것을 찾는 과정에서 나는 무수한 게시물, 글, 평론 등을 만났다. 모든 글은 식물에 생명을 부여하기 위해 반드시 지켜야 할 환경 특성을 개술했다.비록 식물(우리의 예에서 채소)은 바깥에 탄력이 있지만, 일단 식물을 실내로 데리고 들어가거나 토양과 다른 매질(수배)을 사용하면 매우 필요하다.
많은 요소들이 공장의 품질 환경을 결정한다.내가 세상에서 가장 즐거운 식물을 찾을 때 끊임없이 나오는 키워드 중 하나는 "room humidity"(RH)이다.위키백과에 따르면 습도의 30~50%는 일반 가정의'정상'범위다.그러나 우리 채소는 습도가 조금 높으면 숨을 쉴 수 있는 것을 좋아한다.식물의 건강한 생장 환경을 모의하기 위해 우리는 약 70-75%의 상대습도를 촬영할 수 있다.이것이 바로 본문이 주목해야 할 것이다.
공간의 온도와 습도를 어떻게 설정하고 추적하며 측정합니까?

부품 목록


나는 싼 재료를 사용하기로 선택했지만, 나는 네가 나보다 훨씬 싼 방법을 찾을 수 있을 것이라고 믿는다.
  • Raspberry Pi 4 Model B
  • 200GB Sandisk MicroSD
  • DHT11 Temp/Humidity Sensor
  • 이렇게!이것이 바로 네가 이 문장을 위해 필요로 하는 모든 것이다.

    개시하다


    다행이다. 인터넷에는 똑똑한 사람들이 많다. 그들은 나무 베리의 원주율에 나무 베리를 어떻게 설정하는지에 관한 강좌를 많이 제공했다.Here is one such article from the folks over at MagPi(아직 많지만, 이것은 내가 여기서 소개한 범위를 넘어설 것이다).
    완료되면 원격으로 개발할 수 있도록 SSH를 활성화할 수 있습니다.Here is a quick how to에 대해서.
    RPi를 설정한 후에는 모든 도구를 설치해야 합니다.

    기술 스택


    RPi
  • 노드js
  • 타자 원고
  • XDB
  • 그라파나
  • 일부
  • VSCode
  • 모든 터미널iTerm이 훌륭
  • 노드


    나는 this article from Joshua Carter를 사용하여 노드/사선을 설치한다.
    주: 최신 버전의 노드를 사용했습니다. 이것은 첫 번째 12.X 명령에서 14.XcURL로 바꾸었다는 것을 의미합니다.

    몰려들다 / 그라파나


    나는 great tutorial from Simon Hearne influxv1 설정에 관한 규칙을 따랐다.그라파나와 함께 있소.
    주의: v2를 실행하고 싶으면 주의하십시오.대량의 XDB가 있는 경우 RPI에서 64비트 운영 체제를 실행해야 합니다.More about that here .

    VSCode


    Raspberry Pi에서 VScode를 실행할 수 있습니다. 이것은 당신에게 매우 유용할 수 있습니다!그러나 나는 1GB RAM 버전의 RPi 4 모델 B를 구입했다. yarn install 와 VS코드로 코드를 작성하려는 시도 사이에서, 나는 결국 RPi를 잠갔다.
    그래서 더 좋은 방법이 있을 거라고 생각해요.

    VSCode has entered the chat...


    오래 전에 RPi에서 SSH를 사용했던 기억이 있습니까?결과는 VScodehas the ability for us to write code remotely using SSH입니다.이것은 항목에서 나를 현기증나게 하는 부분이다.나는 모든 복잡한 작은 물건을 다 내놓는 것을 그다지 좋아하지 않는다.일단 내가 코드를 좀 쓸 수 있다면, 나는 가능성과 흥분을 보기 시작할 것이다.
    일단 모든 부품을 조립하면 센서 설치를 고려하고 노드와 통신할 수 있다.
    다음 섹션에서는 SSH를 RPi에 연결하고 원격 기기의 터미널을 통해 yarn 명령을 실행하는 것을 좋아합니다.SSH에서 활성화한 VS코드는 내가 작성한 코드에 모두 사용됩니다.

    노드 코드


    이것은 제 것입니다. package.json 따라서 추가할 의존항을 볼 수 있습니다.
    {
      "scripts": {
        "start": "NODE_OPTIONS=--max_old_space_size=1000 TS_NODE_FILES=src/* nodemon src/index.ts -e ts",
        "build": "tsc",
        "vroom": "yarn build && NODE_OPTIONS=--max_old_space_size=1000 ./dist/src/index.js"
      },
      "devDependencies": {
        "@types/node-dht-sensor": "^0.4.0",
        "@typescript-eslint/eslint-plugin": "^4.18.0",
        "@typescript-eslint/parser": "^4.18.0",
        "eslint": "^7.22.0",
        "eslint-config-prettier": "^8.1.0",
        "eslint-plugin-jest": "^24.3.2",
        "eslint-plugin-node": "^11.1.0",
        "nodemon": "^2.0.7",
        "prettier": "^2.2.1",
        "ts-node": "^9.1.1",
        "typescript": "^4.2.3"
      },
      "dependencies": {
        "influx": "^5.8.0",
        "node-dht-sensor": "^0.4.3",
      }
    }
    
    

    타자 원고


    나는 최근에 타자 스크립트를 아주 잘 바꾸는 사람이 되어서, 그것 없이 프로젝트를 시작하는 것을 거절했다.TypeScript를 좋아하지 않거나 사용하지 않으려면 다음 섹션으로 넘어가십시오.

    빠른 시작


    yarn add -D typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-jest eslint-plugin-node nodemon prettier ts-node
    
    여기서 당신은 tsc --init를 실행하거나 나의 tsconfig.json를 복제할 수 있습니다.(이것은 프로젝트 디렉터리의 루트 디렉터리에 있을 것이다)
    {
      "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "declaration": true,
        "sourceMap": true,
        "outDir": "dist",
        "rootDir": "./",
        "strict": true,
        "esModuleInterop": true
      }
    }
    
    참고: JS/TS 프로젝트에서는 다음을 수행할 필요가 없으며 코드를 깔끔하게 유지할 수 있습니다.
    에스린트
    Eslint를 빠르게 설정하기 위해 루트 디렉토리에 두 개의 파일을 추가할 수 있습니다..eslintrc.js :
    module.exports = {
      root: true,
      parser: '@typescript-eslint/parser',
    
      parserOptions: {
        ecmaVersion: 2020
      },
      plugins: [
        '@typescript-eslint',
        'jest',   
      ],
      extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:jest/recommended',
        'plugin:node/recommended',
        'prettier'
      ],
    };
    
    
    .eslintignore
    # don't ever lint node_modules
    node_modules
    # don't lint build output (make sure it's set to your correct build folder name)
    dist
    # don't lint nyc coverage output
    coverage
    
    
    더욱 아름답다.prettierrc.js
    module.exports = {
      printWidth: 100,
      singleQuote: true,
      trailingComma: 'es5',
    };
    
    .prettierignore
    build
    coverage
    dist
    
    봐라!우리는 모두 준비가 다 되었으니 출발 준비를 해라!

    프로젝트 종속성


    고기 덩어리:
    yarn add influx node-dht-sensor
    
    설명은 다음과 같습니다.
    보시다시피 저희는 두 가지 의존항만 있습니다: influxnode-dht-sensor".이 가능하다, ~할 수 있다,...나는 Johnny Five가 사물인터넷의 go-to 노드 라이브러리인 줄 알았다.너는 잘못이 없다!사실 이것이 이 프로젝트의 출발점이다.Johnny Five의 예에는 DHT11 센서with a backpack만 있습니다.현재, 나는 교묘한 인코딩과 GPIO에 대한 진일보한 이해, 그리고 Johny Five가 어떻게 그것들과 상호작용을 하는지, 너는 틀림없이 J5를 잘 놀 수 있을 것이라고 믿는다.말은 그렇지만 우리가 원하는 것은 간단하지 어려움이 아니다😅.
    노드에서 DHT11 센서와 통신하는 방법은 무엇입니까? node-dht-sensor 구조하러 가자.몇몇 빠른 검색을 통해 다른 사람들도 이 문제를 가지고 있다는 것을 발견하였다.😄). 그들의 README 에서 RPi와 센서를 연결하는 데 유용한 도표를 발견할 수 있다.거기서부터 우리는 코드를 작성하기 시작할 수 있다.
    주의: 나는 그들의 도표에서 보여준 것과 같은 파이프를 선택했는데 효과가 매우 좋다.
    RPi GPIO Pin Diagram
    + => 5v
    - => Ground
    out => Pin 4
    

    우리는 이미 몇 가지 코드를 볼 수 있습니까?


    ... 그럼요!
    폴더 구조는 다음과 같이 간단합니다.
    ./src
    |__ index.ts
    
    index 파일은 다음과 같습니다.
    import { promises as sensor } from 'node-dht-sensor';
    
    setInterval(async () => {
      const { temperature, humidity } = await sensor.read(11, 4)
      console.log(`temp: ${temperature}°C, humidity: ${humidity}%`);
    }, 1000);
    
    read 기능을 알려 주십시오DHT11 센서read(11를 사용하고 있습니다.그런 다음 read 기능은 RPi 보드pin 4를 읽습니다. 이것이 바로 센서가 연결된 곳입니다.1000밀리초마다 센서에서 데이터를 읽고 결과를 출력합니다.
    다행이네요. 이제 어떻게 시작해요?
    빠른 교체를 위해 이 프로젝트에 nodemonts-node를 추가했습니다.그러나 package.json 를 돌이켜 보면, 명령을 시작하기 전에 접두사가 있다는 것을 알 수 있을 것이다.
    NODE_OPTIONS=--max_old_space_size=1000
    
    Max old space size는 우리가 전달할 수 있는 노드 옵션으로 노드가 얼마나 많은 메모리를 차지할 수 있는지 알려준다.이 명령은 메가바이트 단위로 작성됩니다.파일 기준:

    On a machine with 2GB of memory, consider setting this to 1536 (1.5GB) to leave some memory for other uses and avoid swapping.


    내 기계에 1GB의 메모리가 있기 때문에 나는 그것을 1000으로 설정했다.만약 내가 이 노드 프로젝트를 실행하는 것이 아니라 다른 일을 하고 있다면, 나는 RPi에게 숨 돌릴 공간을 주기 위해 그것을 약간 낮게 설정할 것이다.만약 노드를 자신의 장치에 남겨 두면, 그것은 대량의 메모리를 차지할 수 있습니다.
    나머지 명령은 다음과 같습니다.
    TS_NODE_FILES=src/* nodemon src/index.ts -e ts
    
    여기에 몇 가지 일이 발생했다.
  • 파일을 어디서 찾을 수 있는지 알려주고 계십니다
  • 당신은 ts-node에 응용 프로그램에 들어갈 입구점을 주고 있습니다(nodemon
  • 당신이 src/index.ts 실행nodemon, 호출ts
  • ts-node 파일의 scripts에 추가하면 RPi에 연결된 package.json 터미널에서 yarn start를 실행할 수 있습니다.
    마지막으로, 너는 몇몇 코드가 실행되는 것을 볼 수 있다.ssh를 실행하면 터미널에서 다음과 같은 출력이 시작되는 것을 볼 수 있습니다.
    temperature: 20°C, humidity: 39%
    
    (스크립트가 GPIO에서 읽을 수 없는 문제가 발생할 수 있습니다.yarn start 또는 do it the safe way with user permissions
    물론 당신의 집이 같은 온도와 습도로 설정되지 않는 한 당신의 수치는 다를 것이다😄.
    🎉 예, 네가 해냈구나!지금은 재어 볼 때다!

    그라파나


    XDB와Grafana UI를 설정한 후에 시각화 효과를 구축하고 싶다고 말씀드릴 수 있습니다.더 이상 기다리지 마라!
    XDB로 데이터 스트리밍을 시작하기 위해 이전에 설치된 sudo yarn start 패키지를 사용할 수 있습니다.
    다음과 같이 influx 파일의 코드를 조정합니다.
    import { InfluxDB, FieldType } from 'influx';
    import { promises as sensor } from 'node-dht-sensor';
    
    const pass = process.env.IN_PASS;
    const influx = new InfluxDB({
      host: 'localhost',
      username: 'grafana',
      password: pass,
      database: 'home',
      schema: [
        {
          measurement: 'response_times',
          fields: {
            path: FieldType.STRING,
            duration: FieldType.INTEGER
          },
          tags: [
            'sensor'
          ]
        }
      ]
    });
    
    setInterval(async () => {
      const { temperature, humidity } = await sensor.read(11, 4)
      console.log(`temperature: ${temperature}°C, humidity: ${humidity}%`);
    
      try {
        influx.writePoints([{
          measurement: 'humidity',
          tags: { sensor: 'humidity' },
          fields: { humidity }
        },
        {
          measurement: 'temp',
          tags: { sensor: 'temperature' },
          fields: { temperature }
        }])
      } catch (e) {
        console.log(e)
      }
    }, 1000);
    
    여기에 약간의 새로운 사물이 있다.나는 그것들을 빠르게 훑어볼 것이다.
  • 먼저 응용 프로그램에서 초기화./src/index.ts의 실례.
  • 이 실례에 전달된 설정은 로컬에서 실행되는db에 연결할 수 있도록 합니다. (볼 수 있습니다. InfluxDB 이것은 내보내는 환경 변수입니다. 비밀번호는 당신의db 사용자 process.env.IN_PASS 로 설정됩니다.스크립트에 인증서가 나타나지 않는 게 좋을 것 같아...설령 이것이 너의 코드라고 해도😄)
  • 당신의 grafanasetInterval를 추가했습니다. 이것이 바로 마법이 발생하는 곳입니다.influx.writePoints밀리초 간격으로 각각의 값이 표시된 유입 데이터 포인트를 발송합니다.
  • 현재, 데이터 흐름을 XDB로 전송했습니다.Grafana로 갈 수 있습니다.Grafana에서 새 대시보드를 만들어야 합니다.완료되면 새 패널이 작성됩니다.패널 내부에서 검색어를 작성하거나 선택할 수 있습니다.이 자습서에 설명된 것과 동일한 이름을 사용하여 데이터베이스를 설정한 경우 질의는 다음과 같습니다.
    SELECT mean("humidity") FROM "humidity" WHERE $timeFilter GROUP BY time($__interval) fill(null)
    

    이렇게!당신은 이미Grafana에서 데이터 시각화를 보았습니다. 데이터는 InfluxDB에서 왔고 모든 데이터는 우리가 TypeScript로 작성한 노드'서버'에서 왔습니다!

    여기서부터 가능성은 무궁하다.스마트 홈api와 통합하여 스위치를 제어하거나 습도가 낮아질 때 자신에게 경보를 보낼 수 있습니다.
    만약 네가 줄곧 나와 함께 있다면, 고마워!나는 네가 매우 즐겁게 지내고, 도중에도 매우 즐겁게 놀기를 바란다.나는 당연히 안다😄.
    👋 다음까지. - Therynamo.

    좋은 웹페이지 즐겨찾기