안정된 실온과 적색 노드

우리 집의 대다수 방은 모두 전기 난방으로 따뜻하게 한다.라디에이터에는 항온기와 온도를 조절하는 눈금판이 내장되어 있다.
문제는 이 시계판은 주로 방의 온도가 아니라 라디에이터 자체의 온도를 조절한다.눈금판에 접촉하지 않는 상황에서 실내 온도는 24시간마다 약 ±1°C 변동한다.또한 실외가 더 춥거나 더 더워지면 시계판을 조절해 실내의 따뜻함을 유지해야 한다.
이것은 내가 어떻게 집에서 안정된 온도를 얻는지에 관한 문장이다.

하드웨어


나는 이미 라스베리에서 zigbee2mqttNode-RED를 운행하여 내가 집에 설치한 일부 자동 장치를 제어했기 때문에 나는 같은 창고를 사용하기로 선택했다.나는 이미 방마다 서로 다른 Zigbee 온도 센서와 사용 가능한 온도 정보를 설치했다.
정격 출력이 4000W인 Tuya Zigbee 계전기를 샀는데, 이것은 내가 1250W의 가열기를 사용하는 데 충분하다.이 계전기의 한 대당 판매 가격은 약 10달러이다.

계전기는 라디에이터에 직렬로 설치되어 있는데, 이것은 그들이 제공하는 유일한 기능이 라디에이터의 전원을 끊는 것을 의미한다.
이것은 라디에이터가 벽에서 떨어지고 플러그 뚜껑이 벗겨진 모습입니다(먼지가 너무 많아서 죄송합니다).

이것은 직렬 계전기의 외관이다.

소프트웨어


가장 쉬운 게 항상 좋은 게 아니에요.


내가 온도를 제어하려고 시도한 최초의 알고리즘은 상상할 수 있는 가장 간단한 것이다. 온도가 설정점에 도달하면 전원을 끊고 그렇지 않으면 전기가 통하는 것을 유지한다.불행히도 이것은 온도를 더욱 안정시키지 못했다.보통 1시간이 걸려야 온도를 약 1°C 높일 수 있기 때문에 전원을 끊으면 온도가 설정점 1°C 이상을 초과한 후 3시간 후에 설정점 1°C 이상보다 낮아진다.
이것은 분명히 좋지 않다. 릴레이가 없는 것보다 더 나쁘다😞
나는 서로 다른 PID 설정에서 많은 작업을 했지만 이번에는 진정한 PID 알고리즘을 사용하기 어렵다고 생각한다. 왜냐하면 라디에이터에 있는 눈금판의 위치와 zigbee 온도 센서의 업데이트율을 고려해야 하기 때문이다.

이차 교체


두 번째 교체에서 나는 소프트웨어에서 가열기를 위해 다른 상태를 도입했는데 나는 onPercentage라고 부른다.말 그대로 히터가 켜진 시간의 백분율이다.현재 onPercentage의 규정에 따라 가열기는 10분마다 한 번씩 켜고 끄는 것이지 계속 켜고 끄는 것이 아니다. 아래와 같다.
if (temperature < setPoint) {
    const minute = parseInt(time.split(':')[1]);

    if (minute % 10 >= onPercentage / 10) {
        return off();
    }

    // to avoid turning all heaters on at the same moment
    await (new Promise(resolve => setTimeout(resolve, Math.random() * 5000)));

    return on();
}
코드에서 보듯이, 나는 가열기를 켤 때도 임의성을 증가시켰다. 왜냐하면 전기 설비를 켤 때마다 순간적인 부하 첨봉이 있기 때문이다. 알고리즘이 minute % 10 === 0에 있을 때 모든 가열기를 동시에 켤 때, 나는 이것이 필요할 수도 있다고 생각한다.
이것은 알고리즘의 절반에 불과하고 onPercentage 자체는 온도독수의 초조와 부조로 조정된다.만약 온도가 설정점에 도달했을 때 여전히 높아지면 onPercentage은 10% 낮아지고 반대로도 마찬가지다.코드의 모양새입니다.
const room = msg.room;
const onPercentage = global.get(`${room}.heater_on_percentage`) || 50;
const setPoint = global.get(`${room}.temperature_setpoint`) || 21;

const previous = global.get(`${room}.temperature`);
const current = payload.temperature;
const increasing = current > previous;
const decreasing = current < previous;

if (setPoint < previous && increasing && onPercentage > 20) {
    return onPercentage - 10;
}
else if (setPoint > previous && decreasing && onPercentage < 100) {
    return onPercentage + 10;
}
// not returning anything means the previous value is retained
본질적으로 이것은 간략한 버전처럼 PID의 비율(설정점에 도달하지 않았을 때 열기)과 포인트onPercentage 부분만 사용한다.
어쨌든, 내가 실현onPercentage했을 때, 나는 그것의 효과가 어떠한지 놀랐다.내가 이 변경을 한 지 이미 몇 달이 되었는데, 첫 번째 배치 이후로, 나는 아직 코드를 접하지 못했다🎉. 실외 온도가 끊임없이 변화하더라도 매일 온도는 설정점 근처에서 안정되어 왔다.나는 쉽게 설정점에 도달할 수 있도록 라디에이터의 눈금판을 이전보다 조금 높게 설정했다.나는 단지 몇 개의 시계판을 한 번 조정했을 뿐인데, 당시 바깥은 훨씬 추웠고, onPercentage의 시계판은 망가졌다.
또 다른 장점은 내가 지금 프로그래밍과/또는 원격으로 가열/온도를 제어할 수 있다는 것이다.
내 노드의 한 시선은 빨간색으로 온도를 조절하는 데 사용된다.

노드 빨간색을 더 잘 알면 화면 오른쪽 아래에 입력되지 않은 기능 노드와 파란색 노드를 알 수 있습니다. 그렇습니다. 이것은 맞춤형 노드입니다. 상태를 수정하고 "React hooks"와 같은 방식으로 상태 변경을 구독할 수 있습니다.
제가 곧 node red 공헌을 발표할 것 같아요.™️, 근데 제가 치우기 전에 실현을 해야 돼요.🙂
즐겁게 놀아라!

좋은 웹페이지 즐겨찾기