#!/usr/bin/env php setCredentials(getenv("MQTT_USER"), getenv("MQTT_PASS")); } $c->connect(MQTT_HOST, 1883, 60); $c->subscribe(ENERGY_METER_TOPIC, 2); $c->subscribe(DOOR_TOPIC, 2); $c->onMessage(function (Message $message) { switch ($message->topic) { case getenv("ENERGY_COUNTER_TOPIC"): energy($message->payload); break; case getenv("DOOR_TOPIC"): door($message->payload); break; } }); while (true) { while ($lastOutput > time() - 10) { $c->loop(1000); } output(); } function door($newStatus) { global $doorStatus, $energyCounter, $doorOpenEnergy, $doorOpenTime; if (is_null($energyCounter)) { return; } $newStatus = (bool) $newStatus; if ($newStatus === $doorStatus) { return; } $doorStatus = $newStatus; if (!$newStatus) { $doorOpenEnergy = $energyCounter; $doorOpenTime = time(); } output(); } function energy($value) { global $energyCounter; $energyCounter = (float) $value; output(); } function output() { global $doorStatus, $energyCounter, $doorOpenEnergy, $doorOpenTime, $lastOutput, $c; if ($doorStatus) { $myUsage = $energyCounter - $doorOpenEnergy; $myCost = $myUsage * ENERGY_PRICE; $c->publish( OUTPUT_TOPIC_PREFIX . "/used_energy_float", strval($myUsage), 2 ); $c->publish(OUTPUT_TOPIC_PREFIX . "/price_float", strval($myCost), 2); $c->publish( OUTPUT_TOPIC_PREFIX . "/price_string", number_format($myCost, 2, ",", "."), 2 ); } else { $c->publish(OUTPUT_TOPIC_PREFIX . "/used_energy_float", "", 2); $c->publish(OUTPUT_TOPIC_PREFIX . "/price_float", "", 2); $c->publish(OUTPUT_TOPIC_PREFIX . "/price_string", "", 2); } $lastOutput = time(); }