$vent) { // Default is open $vval = 100; // Is it enabled if($vent['enabled'] === false) continue; // What does the domoticz data say $cdata = lookup_sensor_idx($domo, 'util', $vent['domo_co2id']); $tdata = lookup_sensor_idx($domo, 'temp', $vent['domo_tempid']); $co2 = floatval($cdata['Data']); // If the CO2/Temp sensor falls through, reset to something sensible, factor of 1 if($co2 == 0) $co2 = (($vent['co2_low'] + $vent['co2_high'])/2); $temp = floatval($tdata['Temp']); if($temp == 0) $temp = 20; echo "Vent {$vent['name']}, Room temp {$temp}, Room CO2 {$co2}. "; $anglediff = 0; // Calculate wind factor based on speed and direction if(isset($wind['windrgr']) && isset($wind['windms'])) { $anglediff = abs(180 - abs((360 - $wind['windrgr']) - (360 - $vent['orientation']))); echo "The angle difference between vent {$id} and the wind is {$anglediff}.\n"; // Small angle difference is head on wind, times the speed for to determine how much we can open. $reduce = round((100 - ($anglediff * ($wind['windms'] * $windmultiplier) * $multiplier)) * ((($vent['co2_low'] + $vent['co2_high'])/2)/$co2)); if($reduce > 100) $reduce = 100; if($reduce < 0) $reduce = 0; $vval = 100 - $reduce; } //echo "The Open value is {$anglediff} * {$wind['windms']} open to {$vval}\n"; // Overrides for border cases if($temp < $vent['t_low']) { $vval = 0; echo "Temperature too low at {$temp} closing\n"; } if($temp > $vent['t_high']) { $vval = 100; echo "Temperature too low at {$temp} closing\n"; } // High CO2 concentrations need to have it open to clear the air. if($co2 < $vent['co2_low']) { $vval = 0; echo "CO2 low enough {$co2}, closing\n"; } // High CO2 concentrations need to have it open to clear the air. if($co2 > $vent['co2_high']) { $vval = 100; echo "CO2 too high {$co2}, opening\n"; } vent_steer($vents, $id, $vval); } function vent_steer($vents, $id, $percent) { $vent = $vents[$id]; // Post servo request to vent with percent open/close if(!isset($vent['esp_url'])) return false; if(!isset($vent['esp_gpio'])) return false; // Maxium rotation. e.g. (45*2) * 50% = midpoint; $max = ($vent['max_angle']*2); if($vent['direction'] == 1) $angle = round(0 + $vent['midpoint'] - $vent['max_angle'] + ($max * ($percent/100))); if($vent['direction'] == -1) $angle = round(0 + $vent['midpoint'] + $vent['max_angle'] - ($max * ($percent/100))); // $angle = (round(($vent['max_angle']/50) * ($percent / 2)) * $amp) + $vent['midpoint']; // $angle = (round((($vent['max_angle']*2)/50) * ($percent / 2)) * $amp) + $vent['midpoint']; $url = "{$vent['esp_url']}?cmd=Servo,1,{$vent['esp_gpio']},{$angle}"; echo "Open vent $id to {$percent}% on {$url}\n"; $result = json_decode(file_get_contents($url), true); if(!empty($result)) { if($result['state'] == 1) { echo "Succesfully steered vent\n"; } else { echo "Failed to steer vent:\n"; echo print_r($result, true); } } sleep(0.5); // Post 9000 degrees to power off $angle = 9000; $url = "{$vent['esp_url']}?cmd=Servo,1,{$vent['esp_gpio']},{$angle}"; $result = json_decode(file_get_contents($url), true); echo "Open vent $id to {$percent}% on {$url}\n"; sleep(0.5); } function lookup_sensor_idx($domo, $cat, $idx) { //print_r($domo[$cat]); if(isset($domo[$cat]['result'])) { foreach($domo[$cat]['result'] as $sensor) { if($sensor['idx'] == $idx) { //echo "Found sensor with id {$idx}\n"; //echo print_r($sensor, true); return $sensor; } } } return false; } function name_to_degree($name) { $degree = 0; switch($name) { case "Noord": $degree = 0; break; case "NNO": $degree = 360 - 22.5; break; case "NO": $degree = 360 - 45; break; case "ONO": $degree = 360 - 45 - 22.5; break; case "Oost": $degree = 270; break; case "OZO": $degree = 270 - 22.5; break; case "ZO": $degree = 270 - 45; break; case "ZZO": $degree = 270 - 45 - 22.5; break; case "Zuid": $degree = 180; break; case "ZZW": $degree = 180 - 22.5; break; case "ZW": $degree = 180 - 45; break; case "WZW": $degree = 180 - 45 - 22.5; break; case "West": $degree = 90; break; case "WNW": $degree = 90 - 22.5; break; case "NW": $degree = 90 - 45; break; case "NNW": $degree = 90 -45 - 22.5; break; } return $degree; } ?>