05 december 2021, 05:18:17

Toon bijdragen

Deze sectie stelt je in staat om alle bijdragen van dit lid te bekijken. Je kunt alleen de bijdragen zien waar je op dit moment toegang toe hebt.

Berichten - Joost

1
PHP / Buienalarm / Buienradar in Domoticz
26 september 2021, 08:58:45
In dit artikel wordt uitgelegd hoe je gegevens van buienradar in Domoticz kunt krijgen. De alert-sensor (links) geeft de zwaarste neerslag in de komende 2 uren aan. Hierbij wordt onderscheid gemaakt tussen:

Levels:

  • Groen: geen neerslag (0 mm)
  • Groen: lichte neerslag (0.1 – 1 mm)
  • Geel: matige neerslag (1 – 3 mm)
  • Oranje: zware neerslag (3 – 10 mm)
  • Rood: zware buien (> 10 mm)

De intensiteit van de neerslag in mm/h

Het tijdstip van de zwaarste neerslag

De text-sensor (rechts) geeft aan op welke tijden het regent (ongeacht de intensiteit).


Aan te maken virtual devices
  • 1x Alert sensor (naam mag je zelf verzinnen)
  • 1x Text sensor (naam mag je zelf verzinnen)

Aanpassingen script
  • Regel 163: IDX-nummer van je Alert-sensor
  • Regel 168 en 170: IDX-nummer van je Text-sensor

Zelf laat ik het script iedere 5 minuten draaien via een container-script, maar je kunt het natuurlijk ook als cronjob laten draaien.

<?php
include("/home/pi/domoticz/scriptsjoost/php/functions.php");
include(
"/home/pi/domoticz/scriptsjoost/php/settings.php");
 
$time date("H:i");
//set the mm of rain you consider it's raining 
$rainthreshold_minutes "0.1" 
$rainthreshold_hours "0.5" 
// according to buienradar there are 5 levels of rain per hour (mm/h)
// 0-2 
// 2-5
// 5-10
// 10-100
// 100+ 
// these are used in the "severity level" 
 
// $lat = "51.43" ; 
// $lon = "6.04" ; 
 
$json file_get_contents("https://gpsgadget.buienradar.nl/data/raintext?lat=".$lat."&lon=".$lon) ;
$json urlencode($json) ; 
$data explode("%0D%0A",$json) ; 
 
$thishour=$nexthour=$ever 0;
$rainbyminutes =  $bool_rainbyminutes '' 
$first_rain "ik heb geen idee" 
$rain_stops "ik heb geen idee" 
$bool_rainnow $bool_rainthis_hour $bool_rainnext_hour =  'false' 
$rain = array(); 
$maxP 0;
$maxDT '';
for(
$i=0;$i<(count($data)-1);$i++){
$tmp urldecode($data[$i]) ;
    
$tmp2 explode("|",$tmp) ;
$neerslg neerslag($tmp2[0]); 
$bool_neerslg "false" 
 
//check max rain///
if ($neerslg $maxP) {
$maxP $neerslg;
$maxDT $i*5;
}
 
// check if it will rain now
if($i==0){
if($neerslg>=$rainthreshold_minutes){
$bool_rainnow 'true' ;
$bool_neerslg 'true' 
$first_rain 'het regent nu.' ; }
}
else{
if($neerslg>=$rainthreshold_minutes){
$bool_neerslg 'true' ;  
if($first_rain == "ik heb geen idee"){
$first_rain $i*5
}
}
}
$rain[] = $neerslg 
 
if($i<12){ //add the items 0 to 11 together to calculate the total rain for this hour
$thishour+= ($neerslg*10)/10 
$ever += ($neerslg*10)/10 ;} 
else{  //same for the rest to calculate next hour
$nexthour+= ($neerslg*10)/10 
$ever += ($neerslg*10)/10 ; }

$rainbyminutes .= '"'.($i*5).'" : "'.$neerslg.'",' ;
$bool_rainbyminutes .= '"'.($i*5).'" : '.$bool_neerslg.',' ;
 
}
 
$rainbyminutes rtrim($rainbyminutes",") ; 
$bool_rainbyminutes rtrim($bool_rainbyminutes",") ; 
 
if(
$thishour>=$rainthreshold_hours){
$bool_rainthis_hour 'true' 
}
if(
$nexthour>=$rainthreshold_hours){
$bool_rainnext_hour 'true' 
}
//find when it will be dry, first find first occurence of rain
$regen_time '' 
if(
$ever>0){
for($i=0;$i<count($rain);$i++){
$regen $rain[$i]; 
// if found stop
if($regen>0.0){
$regen_time $i ;
break;  }
}
//now find the first occurence after the above one
for($i=$regen_time;$i<count($rain);$i++){
$regen_stop $rain[$i]; 
if($regen_stop==0.0){
$rain_stops $i*5;
break; }
else{
$rain_stops "het duurt minimaal ".($i*5)." minuten, maar dit kan veranderen." ;}
}
}
 
echo 
'"rainnow" : '.$bool_rainnow.','.PHP_EOL
echo 
'"rainthis_hour" : '.$bool_rainthis_hour.','.PHP_EOL
echo 
'"rainnext_hour" : '.$bool_rainnext_hour.','.PHP_EOL
echo 
'"this_hour" : "'.$thishour.'", '.PHP_EOL
echo 
'"next_hour" : "'.$nexthour.'", '.PHP_EOL
echo 
'"severitylevel" : { '.PHP_EOL
echo 
'"this_hour" : "'.calc_rainlevel($thishour).'", '.PHP_EOL
echo 
'"next_hour" : "'.calc_rainlevel($nexthour).'" '.PHP_EOL
echo 
'"whenstart" : "'.$first_rain.'", '.PHP_EOL
echo 
'"whenstop" : "'.$rain_stops.'" '.PHP_EOL
 
function 
neerslag($input){
$tmp = (($input-109)/32)  ; 
$tmp pow(10$tmp)  ; 
$tmp round($tmp,1) ;
 
if($tmp == "0" ){
   return "0.0" ; }
else{
return $tmp
}
}
 
function 
calc_rainlevel($input){
if(($input>=&& $input)){
return ; }
elseif(($input>=&& $input)) {
return ; }
elseif(($input>=&& $input10 )) {
return ; }
elseif(($input>=10 && $input<= 100 )) {
return ; }
else{
return ; }
}
 
//ALERT//
//zware buien > 10
//zware neerslag 3-10 mm
//matige neerslag 1-3 mm
//lichte neerslag 0.1-1 mm
//geen neerslag 0 mm

$maxP round($maxP1);
if (
$maxP 0.1) {
$alertLevel 1;
$alertText 'Geen neerslag komende 2 uur'; }
elseif (
$maxP <= 1) {
$alertLevel 1;
$alertText 'Lichte neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP <= 3) {
$alertLevel 2;
$alertText 'Matige neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP <= 10) {
$alertLevel 3;
$alertText 'Zware neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP 10) {
$alertLevel 4;
$alertText 'Zware buien ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';
}
UpdateDevice($idx747$alertLevelurlencode($alertText));
 
//TEXT-DEVICE//
if ($maxP 0.1) {
$textdevice $alertText;
Updatedevice($idx7480urlencode($textdevice));}
else { 
$textdevice 'Neerslag begint rond '.date('h:i'strtotime($time) + ($first_rain 60)).' en duurt ongeveer tot '.date('h:i'strtotime($time) + ($rain_stops 60));
Updatedevice($idx7480urlencode($textdevice));
}
echo 
$textdevice;
 
?>

2
PHP / Melding van aardbevingen op je mobiel
24 juli 2021, 08:00:01
Met onderstaand script krijg je op de telefoon meldingen van aardbevingen die door het KNMI geregistreerd zijn.
  • Maak in Domoticz een virtuele text device aan.
  • Pas de regels met "include" aan.
  • Pas de regels tussen BEGIN SETTINGS en END SETTINGS aan.
  • Laat het scripts periodiek via een cronjob draaien.

<?php
include("/home/pi/domoticz/scriptsjoost/php/functions.php");
include(
"/home/pi/domoticz/scriptsjoost/php/settings.php");

// ******* BEGIN SETTINGS *******
$lat '51.447474'// eigen locatie (lattitude)
$lon '5.756383'// eigen locatie (longitude)
$distMax '250'//afstand hemelsbreed in km
$IDX $idx725// idx-nummer gedefinieerd in settings.php
$url $domoticz_url// domoticz_url gedefinieerd in settings.php
$number 5// aantal laatste aardbevingen;
// ******** END SETTINGS ********

$xml 'https://cdn.knmi.nl/knmi/map/page/seismologie/GQuake_KNMI_RSS.xml';
$xml=simplexml_load_file($xml) or die("Error: Cannot create object");

$text ''
for (
$i 0$i <= ($number-1); $i++) {
    
$dist round(distance($lat$lon$xml->channel->item[$i]->children('geo'true)->lat$xml->channel->item[$i]->children('geo'true)->lon),0);
    if (
$dist <= $distMax) {
    
$description $xml->channel->item[$i]->description "<br><br>";
    
$description explode(','$description);
    
$text $text.$description[0].' ('.$description[1].') | '.str_replace('Plaats = ','',$description[6]).' | '.$description[4].' | '.$description[5].' | Afstand: '.$dist' km'.PHP_EOL.PHP_EOL
    }
}

$data $url.'json.htm?type=devices&rid='.$IDX;
if (
false == ($contents file_get_contents($data))) {
      echo 
"Kan geen gegevens ophalen van Domoticz";
} else {
    
$result=json_decode($contents);
$text3=$result->result[0]->Data;
}

if (
$text != $text3) {
Updatedevice($IDX,0,urlencode($text)); // regio
Telegram($text,false,1);
}
?>

3
Onderstaand PHP-script geeft een melding op Telegram indien:

       
  • het zondag 20.00 uur (overzicht van alle Zigbee-devices met batterij
  • een batterij van een Zigbee-devices lager dan 25% is.

<?php
include("/home/pi/domoticz/scriptsjoost/php/functions.php");
include(
"/home/pi/domoticz/scriptsjoost/php/settings.php");

$today date('w');
$time date("H:i");

//PHP cURL GET request
$get_data callAPI('GET''http://127.0.0.1/api/4831A9C634/sensors'false);
$response json_decode($get_datatrue);

// melding batterij < 25%
   
foreach ($response as $device) {
      if (isset(
$device['config']['battery'])) {
         if (((
$device['type']=='ZHAHumidity')) || (($device['type']=='ZHAPresence')) || (($device['type']=='ZHAOpenClose')) || (($device['type']=='ZHALightLevel'))) {   
            
$level $device['config']['battery'];
            if (
$level 25) {
            
Telegram('Batterij van ' $device['name'] . ' is ' $level '%. Tijd voor een nieuwe batterij!',false,1);
            }
         }
      }
   }

// Op zondag 20:00 uur overzicht van alle batterij-percentages
$text1 ''
if ((
$today == 0) && ($time == "20:00")) {
   foreach (
$response as $device) {
      if (isset(
$device['config']['battery'])) {
         if (((
$device['type']=='ZHAHumidity')) || (($device['type']=='ZHAPresence')) || (($device['type']=='ZHAOpenClose')) || (($device['type']=='ZHALightLevel'))) {   

            
$level $device['config']['battery'];
            
$text1 $text1.'battery level ' $device['name'] . ': ' $level '%'.PHP_EOL
            
//Telegram('battery level ' . $device['name'] . ': ' . $level . '%',false,1);
         
}
      }
   }
}
Telegram($text1,false,1);
?>

4
Hoi Richard,

Ik gebruik Blockly al jaren niet meer (ook in de begintijd nauwelijks gebruikt, vanwege de beperkingen).
Waarom gebruik je geen LUA/dzVents? Of nog beter: PHP?
5
Vergeet je ook wel eens het oud papier op tijd aan de straat te zetten? Met onderstaand PHP-script zal dat niet meer gebeuren.
Bij ons wordt het oud papier op de eerste zaterdag van de maand opgehaald. Is dat bij jou op een andere dag? Vervang dan "first saturday", door iets anders, bijvoorbeeld "third wednesday",  "last monday", "fourth friday", etc.

Het script kun je uit laten voeren door een cronjob, maar ik gebruik zelf een container-script via Domoticz.


<?php
include("/home/pi/domoticz/scripts/php/functions.php");
include(
"/home/pi/domoticz/scripts/php/settings.php");

// Saturday this month
$thisMonthStart mktime(0,0,0,date('m')+0,0,date('Y'));
$saturday date("d.m.Y",strtotime("first saturday"$thisMonthStart ));

//Saturday next month
$nextMonthStart mktime(0,0,0,date('m')+1,1,date('Y'));
$first_saturday date("d.m.Y",strtotime("first saturday"$nextMonthStart));

$tomorrow date("d.m.Y",strtotime("+1 day")); 

if ((
$tomorrow == $saturday) || ($tomorrow == $first_saturday)) {
Telegram("Papier wordt morgenochtend opgehaald!",false,1);
}
?>

6
PHP / Overzicht van alle devices in Domoticz
14 maart 2021, 09:09:55

<?php
include("/home/pi/domoticz/scripts/php/functions.php");
include(
"/home/pi/domoticz/scripts/php/settings.php");

unlink"/home/pi/domoticz/scripts/php/alldevices.txt");

$url $domoticz_url.'json.htm?type=devices';
$contents file_get_contents($url);
$contents=json_decode($contents);

foreach (
$contents->result as $item) {
$naam $item->Name;
$id $item->idx;

$myfile fopen("/home/pi/domoticz/scripts/php/alldevices.txt""a") or die("Unable to open file!");
fwrite($myfile$id.' // '.$naam.PHP_EOL);
fclose($myfile);

}
?>

7

<?php
$domoticz_url
='http://192.168.2.62:8080/'//URL met poortnummer
$toon_ip '192.168.2.59';
$telegrambot1 '645272674:AAGsNuR5l4KHgKcYu60-gY-7O73Z2LFx2A8'; //Telegram Bot 1
$telegrambot2 '1439630098:AAF_5cIii8yqy1g-tyNkiksA3hyhtmsI5JQ'; //Telegram Bot 1
$telegrambot3 '19302673250:AAGhHEe4gYK8HF55DHbTwFIBLQYQo49_uQs'; //Telegram Bot 3
$telegrambot4 '1479652902:AAHAXBjuKTGWCXU4BYtoMjOiSt0dLckNsSw'; //Telegram Bot 4
$telegrambot5 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Telegram Bot 5,niet in gebruik
$telegrambot6 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Telegram Bot 6,niet in gebruik
$telegrambot7 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Telegram Bot 7,niet in gebruik
$telegrambot8 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Telegram Bot 8,niet in gebruik
$telegrambot9 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Telegram Bot 9,niet in gebruik
$chatID1 '385821761';
$chatID2 = array('385821761','1644279431');
$price_elec_high 0.21098;
$price_elec_low 0.19585;
$price_elec 0.203415;

// Alle Domoticz devices met het IDX-nummer
$idx1=1// ToonBoilerTempSetpoint // Temp // LaCrosse TX3
$idx2=2// ToonBranderInfo // Light/Switch // Selector Switch
$idx4=4// ToonIP // General // Text
$idx5=5// ToonThermostat // Thermostat // SetPoint
$idx6=6// Temperatuur Binnen // Temp // LaCrosse TX3
$idx7=7// Toon Scenes // Light/Switch // Selector Switch
$idx8=8// ToonAutoProgram // Light/Switch // Selector Switch
$idx9=9// ToonProgramInformation // General // Text
$idx10=10// Temperatuur Boiler In // Temp // LaCrosse TX3
$idx11=11// Temperatuur Boiler Uit // Temp // LaCrosse TX3
$idx12=12// Boilerdruk // General // Pressure
$idx13=13// Boiler_Modulation_level // General // Percentage
$idx14=14// Switch Meterkast // Light/Switch // Switch
$idx15=15// Alarm Type Meterkast // Light/Switch // Switch
$idx16=16// Alarm Level Meterkast // Light/Switch // Switch
$idx17=17// Power Management Meterkast // Light/Switch // Switch
$idx18=18// kWh Meter Meterkast // General // kWh
$idx19=19// Watt Meterkast // Usage // Electric
$idx20=20// Voltage Meterkast // General // Voltage
// Etc.
?>

8

<?php 

/* 
----------------------------------------------
---------------- VERSION 1.15 ----------------
-------------- DATE: 10-07-2021---------------
----------------------------------------------
*/

include("/home/pi/domoticz/scriptsjoost/php/settings.php");

// *** FUNCTIONS TO RETRIEVE DATA *** //
// *** FUNCTIONS TO RETRIEVE DATA *** //

//Retrieves status On/Off switch
function Status($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$stat $parsed_json['Status'];
# echo "Status ".$stat."\n";
return $stat;
}

//Retrieves level status
function Level($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$level trim($parsed_json['Level']);
# echo "Status ".$level."\n";
return $level;
}

//Retrieves temperature
function Temperature($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$temp trim($parsed_json['Temp']);
# echo "Status ".$temp."\n";
return $temp;
}

//Retrieves pressure
function Pressure($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$pressure trim($parsed_json['Pressure']);
return $pressure;
}

//Retrieves percentage
function Percentage($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$percentage trim($parsed_json['Data']);
$percentage substr($percentage0, -1);
return $percentage;
}

//Retrieves setpoint
function Setpoint($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$setpoint trim($parsed_json['SetPoint']);
return $setpoint;
}

//Retrieves value from text device
function Text($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$text trim($parsed_json['Data']);
return $text;
}

//Retrieves value from user variable
function Variable($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=command&param=getuservariable&idx='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$value $parsed_json['Value'];
return $value;
}

//Retrieves RainRate
function RainRate($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$rainrate trim($parsed_json['RainRate']);
return $rainrate;
}

//Retrieves Radiation
function Radiation($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$radiation trim($parsed_json['Radiation']);
return $radiation;
}

//Retrieves WindSpeed
function WindSpeed($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$windspeed trim($parsed_json['Speed']);
return $windspeed;
}

//Retrieves WindGust
function WindGust($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$windgust trim($parsed_json['Gust']);
return $windgust;
}

// *** FUNCTIONS TO UPDATE DEVICES *** //
// *** FUNCTIONS TO UPDATE DEVICES *** //

//Switches idx On or Off
function SwitchDevice($idx,$cmd) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=switchlight&idx='.$idx.'&switchcmd='.$cmd),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

//Activates scene
function SwitchScene($idx) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=switchscene&idx='.$idx.'&switchcmd=On'),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

//Sets a dimlevel to a dimmer
function SetLevel($idx,$level) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=switchlight&idx='.$idx.'&switchcmd=Set%20Level&level='.$level),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

// Updates the nvalue and svalue of a device. Setpoint are set this way.
function Updatedevice($idx$nvalue$svalue) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=udevice&idx='.$idx.'&nvalue='.$nvalue.'&svalue='.$svalue),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

// Writes a text to the domoticz logfile
function Domlog($msg) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=addlogmessage&message='.$msg),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

// Switch light
function LightOn($idx,$brightness) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=setcolbrightnessvalue&idx='.$idx.'&color={"m":2,"t":154,"r":0,"g":0,"b":0,"cw":101,"ww":154}&brightness='.$brightness),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

// Switch light
function LightOnAlarm($idx,$brightness) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=setcolbrightnessvalue&idx='.$idx.'&color={"m":3,"t":0,"r":255,"g":122,"b":76,"cw":0,"ww":0}&brightness='.$brightness),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

function 
Past($idx) {
global $domoticz_url;
$json_string file_get_contents($domoticz_url.'json.htm?type=devices&rid='.$idx);
$parsed_json json_decode($json_stringtrue);
$parsed_json $parsed_json['result'][0];
$time $parsed_json['LastUpdate'];
# echo "Status ".$temp."\n";
return $time;
}

function 
UpdateVariable($UserVariableName,$UserVariableType,$UserVariableValue) {
  global 
$domoticz_url;
  
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=updateuservariable&vname='.$UserVariableName.'&vtype='.$UserVariableType.'&vvalue='.$UserVariableValue),true);
  if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
  return 
$reply;
}

// Conbee devices bijwerken
function callAPI($method$url$data){
   
$curl curl_init();
   switch (
$method){
      case 
"POST":
         
curl_setopt($curlCURLOPT_POST1);
         if (
$data)
            
curl_setopt($curlCURLOPT_POSTFIELDS$data);
         break;
      case 
"PUT":
         
curl_setopt($curlCURLOPT_CUSTOMREQUEST"PUT");
         if (
$data)
            
curl_setopt($curlCURLOPT_POSTFIELDS$data);  
         break;
      default:
         if (
$data)
            
$url sprintf("%s?%s"$urlhttp_build_query($data));
   }
   
// OPTIONS:
   
curl_setopt($curlCURLOPT_URL$url);
   
curl_setopt($curlCURLOPT_HTTPHEADER, array(
 
//     'APIKEY: 111111111111111111111',
      
'Content-Type: application/json',
   ));
   
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
   
curl_setopt($curlCURLOPT_HTTPAUTHCURLAUTH_BASIC);
   
// EXECUTE:
   
$result curl_exec($curl);
   if(!
$result){die("Connection Failure");}
   
curl_close($curl);
   return 
$result;
}


// *** FUNCTIONS TO SEND NOTIFICATIONS AND WRITE TO LOG *** //
// *** FUNCTIONS TO SEND NOTIFICATIONS AND WRITE TO LOG *** //

// Send notification to via Settings in Domoticz
function Notification($subject,$thebody) {
   global 
$domoticz_url;
    
$reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command&param=sendnotification&subject='.$subject.'&body='.$thebody),true);
   if(
$reply['status']=='OK'$reply='OK';else $reply='ERROR';
   return 
$reply;
}

function 
Telegram($msg,$silent,$to){
global $telegrambot1;
global $telegrambot2;
global $telegrambot3;
global $telegrambot4;
global $telegrambot5;
global $telegrambot6;
global $telegrambot7;
global $telegrambot8;
global $telegrambot9;
global $chatID1;
global $chatID2;
if ($to==1){ //Domoticz bot
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot1.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==2){ //Zonnepanelen bot
foreach($chatID2 as $chatIDs) {
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot2.'/sendMessage?chat_id='.$chatIDs.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
}
if ($to==3){ //Crimesite
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot3.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==4){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot4.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==5){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot5.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==6){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot6.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==7){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot7.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==8){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot8.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
if ($to==9){ //Flitsmeldingen
$result=json_decode(file_get_contents('https://api.telegram.org/bot'.$telegrambot9.'/sendMessage?chat_id='.$chatID1.'&text='.urlencode($msg).'&disable_notification='.$silent));
}
}

$LogFile '/tmp/log/domoticz.log';
function 
Logwrite($msg3,$msg2 NULL) {
global $LogFile;
$time    microtime(true);
$dFormat "Y-m-d H:i:s";
$mSecs   =  $time floor($time);
$mSecs   =  substr(number_format($mSecs,3),1);
$fp fopen($LogFile,"a+");
fwrite($fpsprintf("%s%s %s %s\r\n"date($dFormat), $mSecs$msg3$msg2));
fclose($fp);
}

// *** FUNCTIONS MISCELLANEOUS *** //
// *** FUNCTIONS MISCELLANEOUS *** //

function distance($lat1$lon1$lat2$lon2) { 
$pi80 M_PI 180
$lat1 *= $pi80
$lon1 *= $pi80
$lat2 *= $pi80
$lon2 *= $pi80
$r 6372.797// mean radius of Earth in km 
$dlat $lat2 $lat1
$dlon $lon2 $lon1
$a sin($dlat 2) * sin($dlat 2) + cos($lat1) * cos($lat2) * sin($dlon 2) * sin($dlon 2); 
$c atan2(sqrt($a), sqrt($a)); 
$km $r $c
return $km
}

?>

9
In het script moet https://www.mindergas.nl/api/gas_meter_readings vervangen worden door https://www.mindergas.nl/api/meter_readings. De oude url zal binnenkort nl. niet meer werken.
10
In het script moet https://www.mindergas.nl/api/gas_meter_readings vervangen worden door https://www.mindergas.nl/api/meter_readings.
De oude url zal binnenkort nl. niet meer werken.
11
Met een kleine aanpassen kun je het publieke IP-adres ook in Domoticz laten tonen.
Maak in Domoticz een virtuele text-sensor aan en zet het juiste IDX-nummer in het script:


#!/bin/bash
host='192.168.2.62:8080'
idx=494
fileip='/volume1/scripts/ip-adres/WANIP.txt'
touch $fileip
ip=`wget -q -O - http://ipinfo.io/ip`
previp=`cat $fileip`
recipient='emailadres@outlook.com'
echo $ip > $fileip
if [ "$ip" != "$previp" ]
then

#Domoticz text-sensor updaten
wget -q --delete-after "http://$host/json.htm?type=command&param=udevice&idx=$idx&nvalue=0&svalue=$ip" >/dev/null 2>&1

#Email versturen
sendmail -F "Synology Station" -f $recipient -t $recipient << EOF
Subject: IP-adres is gewijzgd
Het publieke IP-adres is gewijzigd.
Je nieuwe IP-adres is nu $ip
Het oude IP-adres was $previp
EOF
fi
12
Met onderstaand script krijg je de waardes van upload- / downloadsnelheid en ping in Domoticz te zien.

Installeer eerst de python module speedtest-cli op de Synology NAS via de terminal:



sudo wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
sudo chmod +x speedtest-cli


Stappen:

       
  • 3 custom sensors in Domoticz aanmaken, zet de IDX-nummers in onderstaand script
  • Wijzig in het script het IP-adres van de Domoticz-installatie
  • Plaats het script op de Synology NAS (en geef het 755 rechten)
  • Maak op de Synology NAS een terugkerende taak aan (Control Panel > Task Scheduler). Het commando dat uitgevoerd moet worden is sh /volume1/scripts/speedtest/speedtest.sh

#!/bin/bash

#setup
host='192.168.2.62:8080'
#idx for download, upload and ping
idxdl=154
idxul=155
idxpng=156

# speedtest server number
# serverst=xxxx

# no need to edit
# speedtest-cli --simple --server $serverst > outst.txt
/volume1/scripts/speedtest/speedtest-cli --simple > speedtest.txt

download=$(cat speedtest.txt | sed -ne 's/^Download: \([0-9]*\.[0-9]*\).*/\1/p')
upload=$(cat speedtest.txt | sed -ne 's/^Upload: \([0-9]*\.[0-9]*\).*/\1/p')
png=$(cat speedtest.txt | sed -ne 's/^Ping: \([0-9]*\.[0-9]*\).*/\1/p')

# output if you run it manually
echo "Download = $download Mbps"
echo "Upload =  $upload Mbps"
echo "Ping =  $png ms"

# Updating download, upload and ping ..
wget -q --delete-after "http://$host/json.htm?type=command&param=udevice&idx=$idxdl&svalue=$download" >/dev/null 2>&1
wget -q --delete-after "http://$host/json.htm?type=command&param=udevice&idx=$idxul&svalue=$upload" >/dev/null 2>&1
wget -q --delete-after "http://$host/json.htm?type=command&param=udevice&idx=$idxpng&svalue=$png" >/dev/null 2>&1

# Domoticz logging
wget -q --delete-after "http://$host/json.htm?type=command&param=addlogmessage&message=speedtest.net-logging" >/dev/null 2>&1




13
Met onderstaand script krijg je een email als jouw WAN IP wijzigt. Dit script plaats je in een folder op de Synology NAS (wel in het script eventueel de locatie aanpassen). Ook moet je uiteraard het emailadres (recipient) in het script aanpassen.

Voorbereiding:

       
  • Installeren en configureren van Synology Mail Server

#!/bin/bash

fileip='/volume1/scripts/ip-adres/WANIP.txt'
touch $fileip
ip=`wget -q -O - http://ipinfo.io/ip`
previp=`cat $fileip`
recipient='emailadres@outlook.com'
echo $ip > $fileip
if [ "$ip" != "$previp" ]
then
   sendmail -F "Synology Station" -f $recipient -t $recipient << EOF
Subject: IP-adres is gewijzgd
Het publieke IP-adres is gewijzigd.
Je nieuwe IP-adres is nu $ip
Het oude IP-adres was $previp
EOF
fi


Maak vervolgens op de Synology NAS via Control Panel > Task Scheduler een terugkerende taak aan. Het commando dat uitgevoerd moet worden is sh /volume1/scripts/ip-adres/WAN-IP.sh
14
En heb je math.pow(x, y) al vervangen door x^y ?
15
Naar welke berekening ben je naar op zoek?
Over welk script gaat het?