Mon, 04 Aug 2014 19:31:03 +0200
Web - server communication for switches improved.
--- a/thermferm/server.c Mon Aug 04 15:25:13 2014 +0200 +++ b/thermferm/server.c Mon Aug 04 19:31:03 2014 +0200 @@ -998,7 +998,7 @@ units_list *unit, *tmpu; uuid_t uu; socklen_t fromlen; - int i, rlen; + int ival, i, rlen; float fval; opt = strtok(buf, " \0"); @@ -1173,73 +1173,109 @@ } kwd = strtok(ibuf, ",\0"); val = strtok(NULL, "\0"); - if (kwd && val) { + if (kwd) { + fprintf(stdout, "strlen(%s) %d\n", val, strlen(val)); /* * Accept writable data. The client can sent just one line, * but may also sent everything. Simply ignore things we * don't understand. */ - if (strcmp(kwd, (char *)"NAME") == 0) { + if (val && (strcmp(kwd, (char *)"NAME") == 0)) { if (unit->name) free(unit->name); unit->name = xstrcpy(val); - } else if (strcmp(kwd, (char *)"VOLUME") == 0) { + } else if (val && (strcmp(kwd, (char *)"VOLUME") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->volume = fval; } else if (strcmp(kwd, (char *)"AIR_ADDRESS") == 0) { if (unit->air_address) free(unit->air_address); - unit->air_address = xstrcpy(val); + if (val) + unit->air_address = xstrcpy(val); + else + unit->air_address = NULL; } else if (strcmp(kwd, (char *)"BEER_ADDRESS") == 0) { if (unit->beer_address) free(unit->beer_address); - unit->beer_address = xstrcpy(val); + if (val) + unit->beer_address = xstrcpy(val); + else + unit->beer_address = NULL; } else if (strcmp(kwd, (char *)"HEATER_ADDRESS") == 0) { if (unit->heater_address) free(unit->heater_address); - unit->heater_address = xstrcpy(val); + if (val) + unit->heater_address = xstrcpy(val); + else + unit->heater_address = NULL; + + } else if (val && (strcmp(kwd, (char *)"HEATER_STATE") == 0)) { + if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) + unit->heater_state = ival; } else if (strcmp(kwd, (char *)"COOLER_ADDRESS") == 0) { if (unit->cooler_address) free(unit->cooler_address); - unit->cooler_address = xstrcpy(val); + if (val) + unit->cooler_address = xstrcpy(val); + else + unit->cooler_address = NULL; + + } else if (val && (strcmp(kwd, (char *)"COOLER_STATE") == 0)) { + if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) + unit->cooler_state = ival; } else if (strcmp(kwd, (char *)"FAN_ADDRESS") == 0) { if (unit->fan_address) - free(unit->fan_address); - unit->fan_address = xstrcpy(val); + free(unit->fan_address); + if (val) + unit->fan_address = xstrcpy(val); + else + unit->fan_address = NULL; + } else if (val && (strcmp(kwd, (char *)"FAN_STATE") == 0)) { + if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) + unit->fan_state = ival; + } else if (strcmp(kwd, (char *)"DOOR_ADDRESS") == 0) { if (unit->door_address) - free(unit->door_address); - unit->door_address = xstrcpy(val); + free(unit->door_address); + if (val) + unit->door_address = xstrcpy(val); + else + unit->door_address = NULL; - } else if (strcmp(kwd, (char *)"MODE") == 0) { + } else if (val && (strcmp(kwd, (char *)"MODE") == 0)) { for (i = 0; i < 5; i++) { if (strcmp(val, UNITMODE[i]) == 0) { unit->mode = i; + /* Allways turn everything off after a mode change */ + unit->heater_state = unit->cooler_state = unit->fan_state = 0; break; } } - } else if (strcmp(kwd, (char *)"FRIDGE_SET") == 0) { + } else if (val && (strcmp(kwd, (char *)"FRIDGE_SET") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->fridge_set = fval; - } else if (strcmp(kwd, (char *)"BEER_SET") == 0) { + } else if (val && (strcmp(kwd, (char *)"BEER_SET") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->beer_set = fval; } else if (strcmp(kwd, (char *)"PROFILE") == 0) { if (unit->profile) free(unit->profile); - unit->profile = xstrcpy(val); + if (val) + unit->profile = xstrcpy(val); + else + unit->profile = NULL; - } else if (strcmp(kwd, (char *)"PROF_STATE") == 0) { + } else if (val && (strcmp(kwd, (char *)"PROF_STATE") == 0)) { for (i = 0; i < 4; i++) { if (strcmp(val, PROFSTATE[i]) == 0) { unit->prof_state = i; @@ -1247,19 +1283,19 @@ } } - } else if (strcmp(kwd, (char *)"TEMP_SET_MIN") == 0) { + } else if (val && (strcmp(kwd, (char *)"TEMP_SET_MIN") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->temp_set_min = fval; - } else if (strcmp(kwd, (char *)"TEMP_SET_MAX") == 0) { + } else if (val && (strcmp(kwd, (char *)"TEMP_SET_MAX") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->temp_set_max = fval; - } else if (strcmp(kwd, (char *)"IDLE_RANGE_L") == 0) { + } else if (val && (strcmp(kwd, (char *)"IDLE_RANGE_L") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->idle_rangeL = fval; - } else if (strcmp(kwd, (char *)"IDLE_RANGE_H") == 0) { + } else if (val && (strcmp(kwd, (char *)"IDLE_RANGE_H") == 0)) { if (sscanf(val, "%f", &fval) == 1) unit->idle_rangeH = fval;
--- a/www-thermferm/index.php Mon Aug 04 15:25:13 2014 +0200 +++ b/www-thermferm/index.php Mon Aug 04 19:31:03 2014 +0200 @@ -55,6 +55,69 @@ } +if (isset($_POST['HeaterState']) && isset($_POST['UUID'])) { + $sock = open_socket(); + if ($sock != false) { + socket_write($sock, 'UNIT PUT '.$_POST['UUID'], 4096); + usleep(20000); + socket_write($sock, 'HEATER_STATE,'.$_POST['HeaterState'], 4096); + usleep(20000); + socket_write($sock, '.', 4096); + /* Absorb response */ + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + unset($_POST['UUID']); + unset($_POST['HeaterState']); +} + + +if (isset($_POST['CoolerState']) && isset($_POST['UUID'])) { + $sock = open_socket(); + if ($sock != false) { + socket_write($sock, 'UNIT PUT '.$_POST['UUID'], 4096); + usleep(20000); + socket_write($sock, 'COOLER_STATE,'.$_POST['CoolerState'], 4096); + usleep(20000); + socket_write($sock, '.', 4096); + /* Absorb response */ + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + unset($_POST['UUID']); + unset($_POST['CoolerState']); +} + + +if (isset($_POST['FanState']) && isset($_POST['UUID'])) { + $sock = open_socket(); + if ($sock != false) { + socket_write($sock, 'UNIT PUT '.$_POST['UUID'], 4096); + usleep(20000); + socket_write($sock, 'FAN_STATE,'.$_POST['FanState'], 4096); + usleep(20000); + socket_write($sock, '.', 4096); + /* Absorb response */ + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + unset($_POST['UUID']); + unset($_POST['FanState']); +} + + $outstr = '<!DOCTYPE html>'.PHP_EOL; $outstr .= '<html>'.PHP_EOL;
--- a/www-thermferm/liveview.php Mon Aug 04 15:25:13 2014 +0200 +++ b/www-thermferm/liveview.php Mon Aug 04 19:31:03 2014 +0200 @@ -56,6 +56,7 @@ $beer_temperature = "NA"; $power_led = $cooler_led = $heater_led = $fan_led = "off"; $heater = $cooler = $fan = "no"; + $heater_state = $cooler_state = $fan_state = 0; foreach($arr as $l) { $vals = explode(",", $l); @@ -76,15 +77,24 @@ if ((strcmp($vals[0], "BEER_TEMPERATURE") == 0) && ($beer_state == 0)) { $beer_temperature = $vals[1]; } - if ((strcmp($vals[0], "HEATER") == 0) && (strcmp($vals[1], "YES"))) { + if ((strcmp($vals[0], "HEATER_ADDRESS") == 0) && (strcmp($vals[1], "(null)"))) { $heater = "yes"; } - if ((strcmp($vals[0], "COOLER") == 0) && (strcmp($vals[1], "YES"))) { + if (strcmp($vals[0], "HEATER_STATE") == 0) { + $heater_state = $vals[1]; + } + if ((strcmp($vals[0], "COOLER_ADDRESS") == 0) && (strcmp($vals[1], "(null)"))) { $cooler = "yes"; } - if ((strcmp($vals[0], "FAN") == 0) && (strcmp($vals[1], "YES"))) { + if (strcmp($vals[0], "COOLER_STATE") == 0) { + $cooler_state = $vals[1]; + } + if ((strcmp($vals[0], "FAN_ADDRESS") == 0) && (strcmp($vals[1], "(null)"))) { $fan = "yes"; } + if (strcmp($vals[0], "FAN_STATE") == 0) { + $fan_state = $vals[1]; + } } $outstr .= ' <script type="text/javascript">'.PHP_EOL; @@ -191,39 +201,53 @@ $outstr .= ' </div>'.PHP_EOL; $outstr .= ' </div> <!-- fermentor_panel_display -->'.PHP_EOL; + $outstr .= ' <div id="fermentor_panel_control">'.PHP_EOL; + if ($cooler_state == "100") + $cooler_led = "on"; $outstr .= ' <div id="fermentor_led1">'.PHP_EOL; $outstr .= ' <img src="images/led_green_'.$cooler_led.'.png"><br>Cool'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL; + if ($heater_state == "100") + $heater_led = "on"; $outstr .= ' <div id="fermentor_led2">'.PHP_EOL; $outstr .= ' <img src="images/led_green_'.$heater_led.'.png"><br>Heat'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL; + if ($fan_state == "100") + $fan_led = "on"; $outstr .= ' <div id="fermentor_led3">'.PHP_EOL; $outstr .= ' <img src="images/led_green_'.$fan_led.'.png"><br>Fan'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL; + $outstr .= ' <div id="fermentor_toggle1">'.PHP_EOL; $outstr .= ' <form action="index.php" method="post">'.PHP_EOL; - strcmp($mode, "NONE") ? $dis = " disabled" : $dis = ""; - $ch = " checked"; - - $outstr .= ' <input type="radio" name="cooler" onchange="this.form.submit()" value="OFF"'.$dis.$ch.'>Off<br>'.PHP_EOL; - $outstr .= ' <input type="radio" name="cooler" onchange="this.form.submit()" value="ON"'.$dis.'>On'.PHP_EOL; + (($mode == "NONE") && ($cooler == "yes")) ? $dis = "" : $dis = " disabled"; + ($cooler_state == "0") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="CoolerState" onchange="this.form.submit()" value="0"'.$dis.$ch.'>Off<br>'.PHP_EOL; + ($cooler_state == "100") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="CoolerState" onchange="this.form.submit()" value="100"'.$dis.$ch.'>On'.PHP_EOL; $outstr .= ' <input type="hidden" name="UUID" value="'.$unit.'">'.PHP_EOL; $outstr .= ' </form>'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL; + $outstr .= ' <div id="fermentor_toggle2">'.PHP_EOL; $outstr .= ' <form action="index.php" method="post">'.PHP_EOL; - strcmp($mode, "NONE") ? $dis = " disabled" : $dis = ""; - $outstr .= ' <input type="radio" name="heater" onchange="this.form.submit()" value="OFF"'.$dis.$ch.'>Off<br>'.PHP_EOL; - $outstr .= ' <input type="radio" name="heater" onchange="this.form.submit()" value="ON"'.$dis.'>On'.PHP_EOL; + (($mode == "NONE") && ($heater == "yes")) ? $dis = "" : $dis = " disabled"; + ($heater_state == "0") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="HeaterState" onchange="this.form.submit()" value="0"'.$dis.$ch.'>Off<br>'.PHP_EOL; + ($heater_state == "100") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="HeaterState" onchange="this.form.submit()" value="100"'.$dis.$ch.'>On'.PHP_EOL; $outstr .= ' <input type="hidden" name="UUID" value="'.$unit.'">'.PHP_EOL; $outstr .= ' </form>'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL; + $outstr .= ' <div id="fermentor_toggle3">'.PHP_EOL; $outstr .= ' <form action="index.php" method="post">'.PHP_EOL; - strcmp($mode, "NONE") ? $dis = " disabled" : $dis = ""; - $outstr .= ' <input type="radio" name="fan" onchange="this.form.submit()" value="OFF"'.$dis.$ch.'>Off<br>'.PHP_EOL; - $outstr .= ' <input type="radio" name="fan" onchange="this.form.submit()" value="ON"'.$dis.'>On'.PHP_EOL; + (($mode == "NONE") && ($fan== "yes")) ? $dis = "" : $dis = " disabled"; + ($fan_state == "0") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="FanState" onchange="this.form.submit()" value="0"'.$dis.$ch.'>Off<br>'.PHP_EOL; + ($fan_state == "100") ? $ch = " checked" : $ch = ""; + $outstr .= ' <input type="radio" name="FanState" onchange="this.form.submit()" value="100"'.$dis.$ch.'>On'.PHP_EOL; $outstr .= ' <input type="hidden" name="UUID" value="'.$unit.'">'.PHP_EOL; $outstr .= ' </form>'.PHP_EOL; $outstr .= ' </div>'.PHP_EOL;