#!/usr/bin/env php
<?php

/*

  check_dhtxx - Version 1.1
  Written by Robbie Ferguson for NEMS Linux
  -----
  1.0 - August 20, 2020 - Initial release
  1.1 - July 21, 2026 - Allow passing GPIO pin (optional)

*/

  if (count($argv) >=5) {
    array_shift($argv);
    $data['crit_low'] = intval(array_shift($argv));
    $data['warn_low'] = intval(array_shift($argv));
    $data['warn_high'] = intval(array_shift($argv));
    $data['crit_high'] = intval(array_shift($argv));
    $data['type'] = (strtolower(array_shift($argv)) ?: 'temp');

    // Optional GPIO pin number
    $raw_pin     = array_shift($argv);
    $data['pin'] = (!is_null($raw_pin) && is_numeric($raw_pin)) ? intval($raw_pin) : null;

    if ($data['warn_high'] > 59) {
      // Over 59 Degrees: we're working in Fahrenheit
      $type = 'F';
    } else {
      $type = 'C';
    }
  } else {
    echo 'NEMS Linux DHTxx Check' . PHP_EOL;
    echo PHP_EOL . 'Usage:                 ' . $argv[0] . ' crit_low warn_low warn_high crit_high [temp|hum] pin [optional]' . PHP_EOL;
    echo 'Example (Temperature): ' . $argv[0] . ' 10 20 39 45 temp 18' . PHP_EOL;
    echo 'Example (Humidity):    ' . $argv[0] . ' 20 35 65 80 hum 4' . PHP_EOL;
    echo PHP_EOL . 'For backward compatibility, if type is not specified, temp is assumed. If pin is not specified, try to auto-detect.' . PHP_EOL;
    exit(3);
  }

  $pin_arg = (!empty($data['pin']) && is_numeric($data['pin'])) ? ' ' . escapeshellarg($data['pin']) : '';

  $dht = json_decode(shell_exec('/usr/local/bin/nems-info dht22' . $pin_arg));
  if (!is_object($dht) || empty($dht->dht)) {
    $dht = json_decode(shell_exec('/usr/local/bin/nems-info dht11' . $pin_arg));
  }
  if (!is_object($dht) || empty($dht->dht)) {
    echo 'UNKNOWN - DHT Sensor disconnected or not present.';
    exit(3);
  }

#  $values = $dht->c . '°C / ' . $dht->f . '°F, ' . $dht->h . '% Humidity';

  if (is_object($dht) && isset($dht->c)) {
    $data['temperature']['C'] = round($dht->c,1);
    $data['temperature']['F'] = round(($data['temperature']['C'] * 1.8 + 32),1);
    $data['humidity'] = round($dht->h,1);

    if ($data['type'] == 'temp') {
      if ($data['temperature'][$type] < $data['crit_low']) {
        echo 'CRITICAL - ' . $data['temperature']['C'] . '°C / ' . $data['temperature']['F'] . '°F (LOW)';
        exit(2);
      } elseif ($data['temperature'][$type] < $data['warn_low']) {
        echo 'WARNING - ' . $data['temperature']['C'] . '°C / ' . $data['temperature']['F'] . '°F (LOW)';
        exit(1);
      } elseif ($data['temperature'][$type] > $data['crit_high']) {
        echo 'CRITICAL - ' . $data['temperature']['C'] . '°C / ' . $data['temperature']['F'] . '°F (HIGH)';
        exit(2);
      } elseif ($data['temperature'][$type] > $data['warn_high']) {
        echo 'WARNING - ' . $data['temperature']['C'] . '°C / ' . $data['temperature']['F'] . '°F (HIGH)'; 
        exit(1);
      } else {
        echo 'OK - ' . $data['temperature']['C'] . '°C / ' . $data['temperature']['F'] . '°F'; 
        exit(0);
      }
    } elseif ($data['type'] == 'hum') {
      if ($data['humidity'] < $data['crit_low']) {
        echo 'CRITICAL - ' . $data['humidity'] . '% Humidity (LOW)';
        exit(2);
      } elseif ($data['humidity'] < $data['warn_low']) {
        echo 'WARNING - ' . $data['humidity'] . '% Humidity (LOW)';
        exit(1);
      } elseif ($data['humidity'] > $data['crit_high']) {
        echo 'CRITICAL - ' . $data['humidity'] . '% Humidity (HIGH)';
        exit(2);
      } elseif ($data['humidity'] > $data['warn_high']) {
        echo 'WARNING - ' . $data['humidity'] . '% Humidity (HIGH)'; 
        exit(1);
      } else {
        echo 'OK - ' . $data['humidity'] . '% Humidity'; 
        exit(0);
      }
    } else {
      echo 'UNKNOWN - Invalid command type. Options are temp (temperature) or hum (humidity).';
      exit(3);
    }
  } else {
    echo 'UNKNOWN - DHT Sensor disconnected or not present.';
    exit(3);
  }

  
?>
