ノードレッドと定常室温


私の家のほとんどの部屋は電気式のラジエータで暖房されている.ラジエーターは内蔵されたサーモスタットと温度を制御するダイヤルを持っています.
しかし、問題は、このダイヤルが主にラジエータ自体の温度を制御するということです.ダイヤルに触れず,24 h毎に室温は±1°c程度変動する.また、外に冷たくなったり、暖かくなったりすると、部屋の暖かさを保つためにダイヤルを調節する必要があります.
これは、私が家で安定した温度を達成した方法に関する記事です.

ハードウェア


既に走っていたのでzigbee2mqtt and Node-RED 私は自宅で設定したいくつかの自動化を制御するためにラズベリーで、私は同じスタックを使用することを選んだ.私はすでに各部屋にインストールされている別のZigbee温度センサーと利用可能な温度に関する情報を持っていた.
750 Wで評価されるTuya Zigbeeリレーのパックを買いました.そして、それは1250 Wを使用する私のヒーターのためにたっぷりです.リレーはそれぞれ約10ドルかかります.

リレーは、彼らが提供する唯一の機能を意味するラジエーターに直列にインストールされたラジエターに電源を遮断することです.
これは、壁の上のラジエーターと、接続箱の蓋が取り除かれたように見えた(埃のことはごめんなさい)

そして、これはリレーで直列にどのように見えますか

ソフトウェア


最も単純なことは必ずしもベストではない


私が温度を制御しようとした最初のアルゴリズムは、最も簡単に想像できました:温度がセットポイントに達するならば、力を切ってください、さもなければ、力を続けてください.これは残念なことに、温度を少しでも安定させなかった.温度が1°C程度になるのに通常1時間かかるので、一旦電源を切った後、温度は摂氏から1°C以上オーバーシュートし、3時間後に1℃以上アンダーシュートした.
それは明らかに十分ではなかった、それはリレーなしでより悪い😞
私はいろいろと仕事をしたPID セットアップは、しかし、私は本当にPIDアルゴリズムを感じたのは、ZigBee温度センサーの更新率だけでなく、ラジエーター上のダイヤルの位置に要因を設定する必要がありますので、使用するために置くことは困難だった.

番目の反復


番目の反復で、私は私のソフトウェアのヒーターのために別の状態を導入しましたonPercentage . 名前が示すように、それはヒーターがオンになる時間の割合です.すべての時間にヒーターを維持する代わりに、それは10分ごとに10分ごとにオンとオフになりますonPercentage 次のようになります.
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
本質的には、比例した(setpointに達していないときにオンになって)積分と積分を使用する簡素化されたバージョンのようですonPercentage オーバーシュートで制御されるPID .
とにかく、私はonPercentage 実装、私はどのようによくそれが判明驚いた!私がこの変更をしてから、数ヶ月後になりました.最初の展開の後、コードに触れていません🎉. 温度は、温度が変化する外でさえ毎日毎日セッティングの横で安定していました.私は、それが簡単にセッティングに着くのを許すために、以前より少し高いラジエーターの上でダイヤルをセットしました.私は、それが外でずっとより寒くなったとき、一旦ダイヤルのいくらかを調節しただけですonPercentage マックスアウト.
追加の利点は、私は今、プログラムを加熱/温度を制御することができます/またはリモート.
温度を制御するノードの赤い流れを見る

あなたがノードRedでよりよく知られているならば、あなたは画面の右下に入力と青いノードなしで機能ノードに気がつくかもしれません--はい、それらは状態を修正して、「反応フック」で状態変化に加入するためにカスタムメイドのノードです.
私はすぐにそのノード™️, しかし、少し前に実装をきれいにする必要があります🙂
楽しい!