www-thermferm/units.php

Mon, 04 Nov 2019 13:19:27 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 04 Nov 2019 13:19:27 +0100
changeset 604
e2766e538d0e
parent 566
776a605befa5
child 614
389097dc665d
permissions
-rw-r--r--

Version 0.9.7. Increased the maximum fermentation temperature to 45 degrees to allow Kveik fermentations.

<?php
/*****************************************************************************
 * Copyright (C) 2014-2019
 *   
 * Michiel Broek <mbroek at mbse dot eu>
 *
 * This file is part of ThermFerm
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * ThermFerm is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with ThermFerm; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

require_once('utilities.php');


/*
 * $arr contains the complete reply of the LIST command.
 */
$answer = send_cmd("UNIT LIST");
$arr = explode("\r\n", $answer);


if (isset($_GET['action'])) {
    switch ($_GET['action']) {
	case 'edit':            unit_edit();
				break;
	default:                break;
    }
} elseif (isset($_POST['action'])) {
    switch ($_POST['action']) {
	case 'testdata':	testdata();
			        break;
	default:                break;
    }
} else {
    unit_list();
}

exit;

/****************************************************************************
 *
 */

/*
 * Unit add
 *
 * @param string $_POST['Name'] The product name
 */
function unit_add() {

    if ($_POST['key'] == 'Add') {
	send_cmd("UNIT ADD ".$_POST['ProductName']);
    }

    unset($_POST['UUID']);
    unset($_POST['roductName']);
    unset($_POST['key']);
    unset($_POST['command']);
    load('units.php');
}



/*
 * Unit update
 *
 * @param string $_POST['UUID'] The unit UUID
 * @param string $_POST['key'] The button pressed.
 */
function unit_update() {
    /*
     * Build the update command
     */
    if ($_POST['key'] == 'Delete') {
	send_cmd("UNIT DEL ".$_POST['UUID']);
    }

    if ($_POST['key'] == 'Save') {
	$cmd = array("UNIT PUT ".$_POST['UUID']);
	$cmd[] = "PRODUCT_CODE,".$_POST['ProductCode'];
	$cmd[] = "PRODUCT_NAME,".$_POST['ProductName'];
	$cmd[] = "VOLUME,".$_POST['Volume'];
	$cmd[] = "STAGE,".$_POST['Stage'];
	$cmd[] = "AIR_ADDRESS,".$_POST['AirAddress'];
	$cmd[] = "AIR_IDX,".$_POST['AirIdx'];
	$cmd[] = "BEER_ADDRESS,".$_POST['BeerAddress'];
	$cmd[] = "BEER_IDX,".$_POST['BeerIdx'];
	$cmd[] = "CHILLER_ADDRESS,".$_POST['ChillerAddress'];
	$cmd[] = "CHILLER_IDX,".$_POST['ChillerIdx'];
	$cmd[] = "HEATER_ADDRESS,".$_POST['HeaterAddress'];
	$cmd[] = "HEATER_DELAY,".$_POST['HeaterDelay'];
	$cmd[] = "HEATER_IDX,".$_POST['HeaterIdx'];
	$cmd[] = "COOLER_ADDRESS,".$_POST['CoolerAddress'];
	$cmd[] = "COOLER_DELAY,".$_POST['CoolerDelay'];
	$cmd[] = "COOLER_IDX,".$_POST['CoolerIdx'];
	$cmd[] = "FAN_ADDRESS,".$_POST['FanAddress'];
	$cmd[] = "FAN_DELAY,".$_POST['FanDelay'];
	$cmd[] = "FAN_IDX,".$_POST['FanIdx'];
	$cmd[] = "LIGHT_ADDRESS,".$_POST['LightAddress'];
	$cmd[] = "LIGHT_DELAY,".$_POST['LightDelay'];
	$cmd[] = "LIGHT_IDX,".$_POST['LightIdx'];
	$cmd[] = "DOOR_ADDRESS,".$_POST['DoorAddress'];
	$cmd[] = "DOOR_IDX,".$_POST['DoorIdx'];
	$cmd[] = "PSU_ADDRESS,".$_POST['PSUAddress'];
	$cmd[] = "PSU_IDX,".$_POST['PSUIdx'];
	$cmd[] = "TEMP_SET_MIN,".$_POST['TempSetMin'];
	$cmd[] = "TEMP_SET_MAX,".$_POST['TempSetMax'];
	$cmd[] = "PIDC_IMAX,".$_POST['PIDC_iMax'];
	$cmd[] = "PIDC_PGAIN,".$_POST['PIDC_pGain'];
	$cmd[] = "PIDC_DGAIN,".$_POST['PIDC_dGain'];
	$cmd[] = "PIDC_IGAIN,".$_POST['PIDC_iGain'];
	$cmd[] = "PIDC_IDLERANGE,".$_POST['PIDC_idleRange'];
	$cmd[] = "PIDH_IMAX,".$_POST['PIDC_iMax'];
	$cmd[] = "PIDH_PGAIN,".$_POST['PIDH_pGain'];
	$cmd[] = "PIDH_DGAIN,".$_POST['PIDH_dGain'];
	$cmd[] = "PIDH_IGAIN,".$_POST['PIDH_iGain'];
	$cmd[] = "PIDH_IDLERANGE,".$_POST['PIDH_idleRange'];
	$cmd[] = ".";
	send_array($cmd);
    }

    unset($_POST['UUID']);
    unset($_POST['ProductName']);
    unset($_POST['ProductCode']);
    unset($_POST['Volume']);
    Unset($_POST['Stage']);
    unset($_POST['key']);
    unset($_POST['command']);
    unset($_POST['AirAddress']);
    unset($_POST['AirIdx']);
    unset($_POST['BeerAddress']);
    unset($_POST['BeerIdx']);
    unset($_POST['ChillerAddress']);
    unset($_POST['ChillerIdx']);
    unset($_POST['HeaterAddress']);
    unset($_POST['HeaterDelay']);
    unset($_POST['HeaterIdx']);
    unset($_POST['CoolerAddress']);
    unset($_POST['CoolerDelay']);
    unset($_POST['CoolerIdx']);
    unset($_POST['LightAddress']);
    unset($_POST['LightDelay']);
    unset($_POST['LightIdx']);
    unset($_POST['FanAddress']);
    unset($_POST['FanDelay']);
    unset($_POST['FanIdx']);
    unset($_POST['DoorAddress']);
    unset($_POST['DoorIdx']);
    unset($_POST['PSUAddress']);
    unset($_POST['PSUIdx']);
    unset($_POST['TempSetMin']);
    unset($_POST['TempSetMax']);
    unset($_POST['PIDC_iMax']);
    unset($_POST['PIDC_pGain']);
    unset($_POST['PIDC_dGain']);
    unset($_POST['PIDC_iGain']);
    unset($_POST['PIDC_idleRange']);
    unset($_POST['PIDH_iMax']);
    unset($_POST['PIDH_pGain']);
    unset($_POST['PIDH_dGain']);
    unset($_POST['PIDH_iGain']);
    unset($_POST['PIDH_idleRange']);
    load('units.php');
}



/*
 * Test input of a modified or new fermentation unit.
 *
 * @param string $_POST['UUID'] Unique record UUID
 * @param string $_POST['key'] Key choice, Save or Cancel
 * @param string $_POST['command'] Command used, 'add' or 'update'
 *
 * Return: 0 = Ok
 *         1 = Missing data
 *  //       2 = Name field too short
 *  //       3 = Name already in use
 *         4 = TempSetMax <= TempSetMin
 *         5 = TempSetMax < 25 or > 35
 *         6 = TempSetMin < -5 or > 15
 *         7 = HeaterDelay out of range
 *         8 = CoolerDelay out of range
 *         9 = PIDC idleRange out of range
 *        10 = PIDH idleRange out of range
 *        11 = LightDelay out of range
 *	  12 = FanDelay out of range
 *        99 = Cancel key
 */
function test_thedata() {

    global $arr;

    if (isset($_POST['UUID']) && isset($_POST['ProductCode']) && isset($_POST['ProductName']) && isset($_POST['Volume']) && 
	isset($_POST['AirAddress']) && isset($_POST['ChillerAddress']) &&
	isset($_POST['BeerAddress']) && isset($_POST['HeaterAddress']) && 
	isset($_POST['CoolerAddress']) && isset($_POST['LightAddress']) &&
	isset($_POST['HeaterDelay']) && isset($_POST['CoolerDelay']) && isset($_POST['LightDelay']) && isset($_POST['PSUAddress']) &&
	isset($_POST['FanAddress']) && isset($_POST['DoorAddress']) && isset($_POST['TempSetMin']) && isset($_POST['TempSetMax']) &&
	isset($_POST['PIDC_pGain']) && isset($_POST['PIDC_iGain']) && isset($_POST['PIDC_dGain']) && isset($_POST['PIDC_idleRange']) &&
	isset($_POST['PIDH_pGain']) && isset($_POST['PIDH_iGain']) && isset($_POST['PIDH_dGain']) && isset($_POST['PIDH_idleRange']) &&
	isset($_POST['PIDC_iMax']) && isset($_POST['PIDH_iMax']) && isset($_POST['AirIdx']) && isset($_POST['BeerIdx']) &&
	isset($_POST['HeaterIdx']) && isset($_POST['CoolerIdx']) && isset($_POST['LightIdx']) && isset($_POST['DoorIdx']) &&
	isset($_POST['PSUIdx']) && isset($_POST['FanIdx']) && isset($_POST['ChillerIdx']) && isset($_POST['Stage']) &&
	isset($_POST['FanDelay']) && isset($_POST['key']) && isset($_POST['command'])) {

	if ($_POST['key'] == 'Cancel')
	    return 99;

//    	if (strlen($_POST['Name']) < 2)
//	    return 2;

/*    	if (startsWith($arr[0], "212")) {
	    $j = 1;
	    while (1) {
	    	if (strcmp($arr[$j], ".") == 0)
		    break;
	    	$f = explode(",", $arr[$j]);
	    	if (strcmp($f[0], $_POST['UUID']) && (strcmp($f[1], $_POST['Name']) == 0)) {
		    return 3;
	    	}
	    	$j++;
	    }
	} */

	if ($_POST['TempSetMax'] <= $_POST['TempSetMin'])
	    return 4;

	if (($_POST['TempSetMax'] < 25) || ($_POST['TempSetMax'] > 45))
	    return 5;

	if (($_POST['TempSetMin'] < -5) || ($_POST['TempSetMin'] > 15))
	    return 6;

	if (($_POST['HeaterDelay'] < 0) || ($_POST['HeaterDelay'] > 720))
	    return 7;

	if (($_POST['CoolerDelay'] < 0) || ($_POST['CoolerDelay'] > 720))
	    return 8;

	if (($_POST['PIDC_idleRange'] < 0) || ($_POST['PIDC_idleRange'] > 5))
	    return 9;

	if (($_POST['PIDH_idleRange'] < 0) || ($_POST['PIDH_idleRange'] > 5))
	    return 10;

	if (($_POST['LightDelay'] < 0) || ($_POST['LightDelay'] > 720))
	    return 11;

	if (($_POST['FanDelay'] < 0) || ($_POST['FanDelay'] > 720))
	    return 12;

    } else {
	return 1;
    }

    return 0;
}



/*
 * Test result from edit screen and do next action
 */
function testdata() {

    $result = test_thedata();
    $error = '';

    switch ($result) {
	case 0: if ($_POST['command'] == 'add') {
		    unit_add();
		    return;
		} else if ($_POST['command'] == 'update') {
		    unit_update();
		    return;
		}
		break;
	case 1: $error = 'Missing data';
		break;
	case 2: $error = 'The name is too short';
		break;
	case 3: $error = 'The name is already in use, choose another one';
		break;
	case 4: $error = 'Temperature Maximum cannot be smaller then Temperature Minimum';
		break;
	case 5: $error = 'Temperature Maximum must be between 25 and 45 &deg;C';
		break;
	case 6:	$error = 'Temperature Minimum must be between -5 and 15 &deg;C';
		break;
	case 7: $error = 'Heater Delay must be bewteen 0 and 720 seconds';
		break;
	case 8:	$error = 'Cooler Delay must be bewteen 0 and 720 seconds';
		break;
	case 9: $error = 'PID cool Idle Range must be between 0 en 5';
		break;
	case 10: $error = 'PID heat Idle Range must be between 0 and 5';
		break;
	case 11: $error = 'Light Delay must be bewteen 0 and 720 seconds';
		break;
	case 12: $error = 'Fan Delay must be bewteen 0 and 720 seconds';
		break;
	case 99:        
		load('units.php');
		break;
    }

    if ($_POST['command'] == 'add') {
	$heading = 'ThermFerm - Add Unit';
    } else {
	$heading = 'ThermFerm - Edit Unit';
    }

    edit_screen($_POST['UUID'], $_POST['command'], $heading, $error);
}



/*
 * Unit edit screen. Used by unit_edit(), unit_add() and testdata()
 *
 * @param string $UUID The record UUID (fixed).
 * @param string $command 'add' or 'update'
 * @param string $heading Page heading title.
 * @Param string $error_message Blank or previous error.
 */
function edit_screen($UUID, $command, $heading, $error_message) {

    /*
     * Get list of devices, we need it later
     */
    $answer = send_cmd("DEVICE LIST");
    $devices = explode("\r\n", $answer);

    /*
     * Get current unit data
     */
    $answer = send_cmd("UNIT GET ".$UUID);
    $reply = explode("\r\n", $answer);

    $outstr  = build_header($heading);
    $outstr .= '    <div id="errors">'.PHP_EOL;
    $outstr .= '     '.$error_message.PHP_EOL;
    $outstr .= '    </div> <!-- errors -->'.PHP_EOL;
    $outstr .= '    <div id="etable">'.PHP_EOL;
    $outstr .= '     <form method="POST" action="units.php">'.PHP_EOL;
    $outstr .= '      <table class="editor">'.PHP_EOL;

    if (startsWith($reply[0], "213")) {
	$i = 1;
	while (1) {
	    if (strcmp($reply[$i], ".") == 0)
		break;
	    $f = explode(",", $reply[$i]);

	    if ($f[0] == "PRODUCT_CODE") {
	    	$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Product Code</td>'.PHP_EOL;
		$outstr .= '        <td colspan="3" class="editfield"><input type="text" name="ProductCode" size="32" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PRODUCT_NAME") {
    		$outstr .= '       <tr class="editor">'.PHP_EOL;
    		$outstr .= '        <td class="editname">Product Name</td>'.PHP_EOL;
    		$outstr .= '        <td colspan="3" class="editfield"><input type="text" name="ProductName" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "STAGE") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Fermentation</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="Stage">'.PHP_EOL;
		($f[1] == "PRIMARY") ? $se = " selected" : $se = "";
		$outstr .= '         <option value="PRIMARY"'.$se.'>Primary</option>'.PHP_EOL;
		($f[1] == "SECONDARY") ? $se = " selected" : $se = "";
		$outstr .= '         <option value="SECONDARY"'.$se.'>Secondary</option>'.PHP_EOL;
		($f[1] == "TERTIARY") ? $se = " selected" : $se = "";
		$outstr .= '         <option value="TERTIARY"'.$se.'>Tertiary</option>'.PHP_EOL;
		($f[1] == "CARBONATION") ? $se = " selected" : $se = "";
		$outstr .= '         <option value="CARBONATION"'.$se.'>Carbonation</option>'.PHP_EOL;
		$outstr .= '        </select></td>'.PHP_EOL;
	    }

	    if ($f[0] == "VOLUME") {
    		$outstr .= '        <td class="editname">Unit Volume</td>'.PHP_EOL;
    		$outstr .= '        <td class="editfield"><input type="text" name="Volume" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "AIR_ADDRESS") {
    		$outstr .= '       <tr class="editor">'.PHP_EOL;
    		$outstr .= '        <td class="editname">Air Sensor Address</td>'.PHP_EOL;
    		$outstr .= '        <td class="editfield"><select name="AirAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
	    	    	if (strcmp($devices[$j], ".") == 0)
			    break;
		    	$g = explode(",", $devices[$j]);
		    	if ($g[5] == "IN_ANALOG") {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
		    	}
		    	$j++;
		    }
		}
    		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "AIR_IDX") {
		$outstr .= '        <td class="editname">Air domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="AirIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "BEER_ADDRESS") {
                $outstr .= '       <tr class="editor">'.PHP_EOL;
                $outstr .= '        <td class="editname">Beer Sensor Address</td>'.PHP_EOL;
                $outstr .= '        <td class="editfield"><select name="BeerAddress">'.PHP_EOL;
                $outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
                if (startsWith($devices[0], "212")) {
                    $j = 1;
                    while (1) {
                        if (strcmp($devices[$j], ".") == 0)
                            break;
                        $g = explode(",", $devices[$j]);
			if ($g[5] == "IN_ANALOG") {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
                            $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
                        }
                        $j++;
                    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "BEER_IDX") {
		$outstr .= '        <td class="editname">Beer domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="BeerIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "CHILLER_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Chiller Sensor Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="ChillerAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if ($g[5] == "IN_ANALOG") {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "CHILLER_IDX") {
		$outstr .= '        <td class="editname">Chiller domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="ChillerIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "HEATER_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Heater Switch Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="HeaterAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if (($g[5] == "OUT_ANALOG") || ($g[5] == "OUT_BIN")) {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "HEATER_DELAY") {
		$outstr .= '        <td class="editname">Heater Switch Delay</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="HeaterDelay" size="5" value="'.$f[1].'"> seconds (0..720)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "HEATER_IDX") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Heater domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="HeaterIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDH_IMAX") {
		$outstr .= '        <td class="editname">PID Heat Maximum</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDH_iMax" size="6" value="'.$f[1].'"> % (1..100)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PIDH_IDLERANGE") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Heater Idle Range</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDH_idleRange" size="6" value="'.$f[1].'"> &deg;C (Heater margin)</td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDH_PGAIN") {
		$outstr .= '        <td class="editname">PID Heat pGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDH_pGain" size="6" value="'.$f[1].'"> Proportional</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PIDH_IGAIN") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">PID Heat iGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDH_iGain" size="6" value="'.$f[1].'"> Intergral</td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDH_DGAIN") {
		$outstr .= '        <td class="editname">PID Heat dGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDH_dGain" size="6" value="'.$f[1].'"> Derivative</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "COOLER_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Cooler Switch Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="CoolerAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if (($g[5] == "OUT_ANALOG") || ($g[5] == "OUT_BIN")) {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "COOLER_DELAY") {
		$outstr .= '        <td class="editname">Cooler Switch Delay</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="CoolerDelay" size="5" value="'.$f[1].'"> seconds (0..720)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "COOLER_IDX") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Cooler domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="CoolerIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDC_IMAX") {
		$outstr .= '        <td class="editname">PID Cool Maximum</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDC_iMax" size="6" value="'.$f[1].'"> % (1..100)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PIDC_IDLERANGE") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Cooler Idle Range</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDC_idleRange" size="6" value="'.$f[1].'"> &deg;C (Cooler margin)</td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDC_PGAIN") {
		$outstr .= '        <td class="editname">PID Cool pGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDC_pGain" size="6" value="'.$f[1].'"> Proportional</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PIDC_IGAIN") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">PID Cool iGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDC_iGain" size="6" value="'.$f[1].'"> Intergral</td>'.PHP_EOL;
	    }
	    if ($f[0] == "PIDC_DGAIN") {
		$outstr .= '        <td class="editname">PID Cool dGain</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PIDC_dGain" size="6" value="'.$f[1].'"> Derivative</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "FAN_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Fan Switch Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="FanAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if (($g[5] == "OUT_ANALOG") || ($g[5] == "OUT_BIN")) {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "FAN_DELAY") {
		$outstr .= '        <td class="editname">Fan Switch Delay</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="FanDelay" size="5" value="'.$f[1].'"> seconds (0..720)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "FAN_IDX") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Fan domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td colspan="3" class="editfield"><input type="text" name="FanIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "LIGHT_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Lights Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="LightAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if (($g[5] == "OUT_ANALOG") || ($g[5] == "OUT_BIN")) {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }

	    if ($f[0] == "LIGHT_DELAY") {
		$outstr .= '        <td class="editname">Lights Delay</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="LightDelay" size="5" value="'.$f[1].'"> seconds (0..720)</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "LIGHT_IDX") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Light domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td colspan="3" class="editfield"><input type="text" name="LightIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "DOOR_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Door Sensor Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="DoorAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {               
		    $j = 1;                                                                     
		    while (1) {                                                                                     
		    	if (strcmp($devices[$j], ".") == 0)                                                                                         
			    break;
		    	$g = explode(",", $devices[$j]);
		    	if ($g[5] == "IN_BIN") {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
		    	}
		    	$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;                        
	    }
	    if ($f[0] == "DOOR_IDX") {
		$outstr .= '        <td class="editname">Door domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="DoorIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "PSU_ADDRESS") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">PSU Sensor Address</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><select name="PSUAddress">'.PHP_EOL;
		$outstr .= '         <option value="">Not Assigned</option>'.PHP_EOL;
		if (startsWith($devices[0], "212")) {
		    $j = 1;
		    while (1) {
			if (strcmp($devices[$j], ".") == 0)
			    break;
			$g = explode(",", $devices[$j]);
			if ($g[5] == "IN_BIN") {
			    ($f[1] == $g[0]) ? $se = " selected" : $se = "";
			    $outstr .= '         <option value="'.$g[0].'"'.$se.'>'.$g[1].' '.$g[4].'</option>'.PHP_EOL;
			}
			$j++;
		    }
		}
		$outstr .= '        </select></td>'.PHP_EOL;
	    }
	    if ($f[0] == "PSU_IDX") {
		$outstr .= '        <td class="editname">PSU domoticz idx</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="PSUIdx" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    if ($f[0] == "TEMP_SET_MIN") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Min. temp setting</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="TempSetMin" size="5" value="'.$f[1].'"> &deg;C</td>'.PHP_EOL;
	    }
	    if ($f[0] == "TEMP_SET_MAX") {
		$outstr .= '        <td class="editname">Max. temp setting</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="TempSetMax" size="5" value="'.$f[1].'"> &deg;C</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }

	    $i++;
	}
    }
    $outstr .= '       <tr class="editor">'.PHP_EOL;
    $outstr .= '        <td class="editname"><input type="submit" value="Save" name="key"></td>'.PHP_EOL;
    $outstr .= '        <td colspan="3" class="editfield"><input type="submit" value="Cancel" name="key">';
    $outstr .= '<input type="submit" value="Delete" name="key" style="margin-left: 100px;">';
    $outstr .= '<input type="hidden" value="testdata" name="action">';
    $outstr .= '<input type="hidden" value="'.$command.'" name="command">';
    $outstr .= '<input type="hidden" value="'.$UUID.'" name="UUID"></td>'.PHP_EOL;
    $outstr .= '       </tr>'.PHP_EOL;
    $outstr .= '      </table>'.PHP_EOL;
    $outstr .= '     </form>'.PHP_EOL;
    $outstr .= '    </div> <!-- etable -->'.PHP_EOL;
    $outstr .= '    <script type="text/javascript">'.PHP_EOL;
    $outstr .= '     $(document).ready(function () {'.PHP_EOL;
    $outstr .= '      $("#maintenance").jqxButton({ width: 150, height: 25, theme: \'ui-redmond\' });'.PHP_EOL;
    $outstr .= '     });'.PHP_EOL;
    $outstr .= '    </script>'.PHP_EOL;
    $outstr .= build_footer();
    echo $outstr;
}



/*
 * Edit a Unit. Fetches the record data and shows the edit screen.
 *
 * @param string $_GET['action'] Must be 'edit'.
 * @param string $_GET['UUID'] The UUID of the Unit.
 */
function unit_edit() {
    if ($_GET['action'] == 'edit') {
	edit_screen($_GET['UUID'], 'update', 'ThermFerm - Edit Unit', '');
	return;
    } else {
	load('units.php');
    }
}



/*
 * @link edit unit
 * @link add unit
 */
function unit_list() {

    global $arr;

    $outstr  = build_header('ThermFerm - Units Maintenance');
    $outstr .= '    <div id="errors">'.PHP_EOL;
    $outstr .= '    </div> <!-- errors -->'.PHP_EOL;
    $outstr .= '    <div id="etable">'.PHP_EOL;
    $outstr .= '     <table class="setup">'.PHP_EOL;
    $outstr .= '      <tr class="trhead">'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 300px;">UUID</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 300px;">Alias</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 60px;">Mode</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 40px;">Edit</td>'.PHP_EOL;
    $outstr .= '      </tr>'.PHP_EOL;

    if (startsWith($arr[0], "212")) {
    	$j = 1;
    	while (1) {
	    if (strcmp($arr[$j], ".") == 0)
	    	break;
	    $f = explode(",", $arr[$j]);
	    $outstr .= '      <tr class="setup">'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[0].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[1].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[2].'</td>'.PHP_EOL;
	    if (strcmp($f[2], "OFF")) {
		$outstr .= '       <td class="setup">Busy</td>'.PHP_EOL;
	    } else {
		$outstr .= '       <td class="setup"><a href="units.php?action=edit&amp;UUID='.$f[0].'">Edit</a></td>'.PHP_EOL;
	    }
	    $outstr .= '      </tr>'.PHP_EOL;
	    $j++;
    	}
    }

    $outstr .= '     </table>'.PHP_EOL;
    $outstr .= '    </div> <!-- etable -->'.PHP_EOL;

    $outstr .= '    <div id="atable">'.PHP_EOL;
    $outstr .= '     <form method="POST" action="units.php">'.PHP_EOL;
    $outstr .= '      <table class="editor">'.PHP_EOL;
    $outstr .= '      <tr class="trhead"><td colspan="3">Add new unit</td></tr>'.PHP_EOL;
    $outstr .= '       <tr class="editor">'.PHP_EOL;
    $outstr .= '        <td class="editname">Product Name</td>'.PHP_EOL;
    $outstr .= '        <td class="editfield"><input type="text" name="ProductName" size="50" value=""></td>'.PHP_EOL;
    $outstr .= '        <td class="editsub"><input type="submit" value="Add" name="key"></td>'.PHP_EOL;
    $outstr .= '<input type="hidden" value="FAKE000" name="ProductCode">';
    $outstr .= '<input type="hidden" value="0.0" name="Volume">';
    $outstr .= '<input type="hidden" value="PRIMARY" name="Stage">';
    $outstr .= '<input type="hidden" value="" name="AirAddress">';
    $outstr .= '<input type="hidden" value="0" name="AirIdx">';
    $outstr .= '<input type="hidden" value="" name="BeerAddress">';
    $outstr .= '<input type="hidden" value="0" name="BeerIdx">';
    $outstr .= '<input type="hidden" value="" name="ChillerAddress">';
    $outstr .= '<input type="hidden" value="0" name="ChillerIdx">';
    $outstr .= '<input type="hidden" value="" name="HeaterAddress">';
    $outstr .= '<input type="hidden" value="20" name="HeaterDelay">';
    $outstr .= '<input type="hidden" value="0" name="HeaterIdx">';
    $outstr .= '<input type="hidden" value="" name="CoolerAddress">';
    $outstr .= '<input type="hidden" value="20" name="CoolerDelay">';
    $outstr .= '<input type="hidden" value="0" name="CoolerIdx">';
    $outstr .= '<input type="hidden" value="" name="FanAddress">';
    $outstr .= '<input type="hidden" value="20" name="FanDelay">';
    $outstr .= '<input type="hidden" value="0" name="FanIdx">';
    $outstr .= '<input type="hidden" value="" name="LightAddress">';
    $outstr .= '<input type="hidden" value="1" name="LightDelay">';
    $outstr .= '<input type="hidden" value="0" name="LightIdx">';
    $outstr .= '<input type="hidden" value="" name="DoorAddress">';
    $outstr .= '<input type="hidden" value="0" name="DoorIdx">';
    $outstr .= '<input type="hidden" value="" name="PSUAddress">';
    $outstr .= '<input type="hidden" value="0" name="PSUIdx">';
    $outstr .= '<input type="hidden" value="1.0" name="TempSetMin">';
    $outstr .= '<input type="hidden" value="30.0" name="TempSetMax">';
    $outstr .= '<input type="hidden" value="100" name="PIDC_iMax">';
    $outstr .= '<input type="hidden" value="4.0" name="PIDC_pGain">';
    $outstr .= '<input type="hidden" value="0.2" name="PIDC_dGain">';
    $outstr .= '<input type="hidden" value="1.0" name="PIDC_iGain">';
    $outstr .= '<input type="hidden" value="1.0" name="PIDC_idleRange">';
    $outstr .= '<input type="hidden" value="100" name="PIDH_iMax">';
    $outstr .= '<input type="hidden" value="4.0" name="PIDH_pGain">';
    $outstr .= '<input type="hidden" value="0.2" name="PIDH_dGain">';
    $outstr .= '<input type="hidden" value="1.0" name="PIDH_iGain">';
    $outstr .= '<input type="hidden" value="1.0" name="PIDH_idleRange">';
    $outstr .= '<input type="hidden" value="testdata" name="action">';
    $outstr .= '<input type="hidden" value="add" name="command">';
    $outstr .= '<input type="hidden" value="00000000-0000-0000-0000-000000000000" name="UUID">';
    $outstr .= '       </tr>'.PHP_EOL;
    $outstr .= '      </table>'.PHP_EOL;
    $outstr .= '     </form>'.PHP_EOL;
    $outstr .= '    </div> <!-- atable -->'.PHP_EOL;
    $outstr .= '    <script type="text/javascript">'.PHP_EOL;
    $outstr .= '     $(document).ready(function () {'.PHP_EOL;
    $outstr .= '      $("#maintenance").jqxButton({ width: 150, height: 25, theme: \'ui-redmond\' });'.PHP_EOL;
    $outstr .= '     });'.PHP_EOL;
    $outstr .= '    </script>'.PHP_EOL;
    $outstr .= build_footer();
    echo $outstr;
}

mercurial