27 september 2021, 10:44:04

Recente berichten

Pagina's1 2 3 ... 10
1
PHP / Buienalarm / Buienradar in Dom...
Laatste bericht door Joost - 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
dzVents / Re: Zonwering automatisch open...
Laatste bericht door ricvee - 25 augustus 2021, 13:22:12
Hallo,

Ik ben een variant op dit script aan het maken.
Weet iemand hoe dat handmatig overrulen werkt?
Dat lukt me nog niet.

Met vriendelijke groet,

Richard
Oplossing gevonden!
Ik heb inmiddels begrepen hoe het werkt: je maakt een extra virtuele switch die je kunt uitzetten om het script uit te zetten, en daarna kun je dan handmatig schakelen.
Ik was in de veronderstelling dat er iets aan de zonwering gekoppeld kon worden waardoor het script dan automatisch uitgezet zou worden, maar zo werkt het dus niet...
3
dzVents / Re: Rolgordijnen automatisch o...
Laatste bericht door ricvee - 26 juli 2021, 06:44:49
Ik gebruik ook geen blockly, ik heb deze omgebouwd naar dzvents.
De oplossing voor mijn probleempje was dit:
shutter1.switchOn().afterSec(11)
4
PHP / Melding van aardbevingen op je...
Laatste bericht door Joost - 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);
}
?>

5
PHP / Telegram-melding van batterijp...
Laatste bericht door Joost - 18 juli 2021, 07:27:21
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);
?>

6
dzVents / Re: Rolgordijnen automatisch o...
Laatste bericht door Joost - 18 juli 2021, 07:16:53
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?
7
dzVents / Re: Rolgordijnen automatisch o...
Laatste bericht door ricvee - 13 juli 2021, 13:15:05
Hi Joost,

Ik ben een variant van dit script aan het maken voor mijn rolluiken.

Ik wil deze gedeeltelijk laten zakken. In een blockly druk je dan een 2e keer op de knop na x seconden.
Jij gebruikt dit:
RollerblindFront.switchOff().forSec(1.9)

Als ik dit probeer, gaan mijn rolluiken helaas toch volledig dicht.
Heb jij een idee?

Groet,

Richard

8
LUA / Re: Maak van je Raspberry Pi e...
Laatste bericht door cweegels - 08 april 2021, 08:40:18
Het verwonderde mij altijd, dat ik van de weer-alerts een e-mail ontvanging, met daarin platte tekst, maar ook html en e-mail headers, of zulke dingen als MIME-type.
Nooit kunnen vinden wat de oorzaak was, tot ik deze week zocht.
Het script dat ik gebruik staat in de 1e post: https://domoticaboard.nl/index.php?topic=42.msg44#msg44

Fout staat naar mijn idee in het stukje code (boven devices updaten):

if val_AlertLevelNow ~= val_AlertLevel_Today then
  commandArray['SendNotification'] = "Code "..val_AlertColour_Today.."\n " .."\n"..val_AlertToday
end


De regel van de commandArray, het scheidingsteken is een hekje (#), zie https://www.domoticz.com/wiki/Events#CommandArray_Examples

commandArray['SendNotification']='subject#body#0'

Dus ik heb de regel als volgt aangepast:

commandArray['SendNotification'] = "Weeralarm: Code "..val_AlertColour_Today.."#"..val_AlertToday.."#0"

De eerste mail gisteren of code groen, zag er wel goed uit. Ik houd even in de gaten, of dat in de toekomst met alerts ook goed gaat.
9
LUA / Is er iemand thuis voor iPhone...
Laatste bericht door Dickey - 27 maart 2021, 13:57:05
Bij het zoeken naar bruikbare scripts kwam ik deze tegen, die aan de hand van de locatie van een iPhone kan bepalen of er iemand thuis is of niet. Voorwaarde is wel dat alle huisgenoten over een iPhone beschikken.

Op regel 5 kun je de interval invullen. Let wel op: 5 minuten is redelijk, lager gaat ten koste van je iPhone batterij. -:)
Vul de Apple account gegevens in op regel 13. Device naam moet exact overeenkomen met de naam van je toestel.

Op regel 17 de long. en latitude opgeven. Klik even op google maps om je thuis locatie te vinden.
De radius heb ik op 0,5 staan (500 meter), dit voldoet prima.

Voeg een dummy device toe voor elke telefoon die je wilt volgen.
Optioneel kun je een extra device toevoegen, die checkt of alle telefoons weg zijn waarna vervolgens de door jou gewenste actie kan worden uitgevoerd.


-- Script to check the location of multiple iPhones every X minutes,
-- test if they are "home" and represent this using virtual switches

commandArray = {}
-- polling interval in minutes (1-59), setting this too low may drain the phones' batteries
interval = 5
local m = os.date('%M')
if (m % interval == 0) then

  json = require('json')

  -- Array of users to be checked
  users = {
            Name1 = {username = "Name1@gmail.com" ; password = "*********" ; devicename = "iPhone Name1"};
            Name2 = {username = "Name2@gmail.com" ; password = "*********" ; devicename = "iPhone Name2"};
          }
  -- The latitude and longitude of your house (use Google Maps or similar to find this)
  homelongitude = *.*****
  homelatitude = *.*****
  -- Radius (in km) which will be used to determine if a device is at home
  radius = 0.5
 
  for user,credentials in pairs(users) do
    stage1command = "curl -sk -X POST -D - -o /dev/null -L -u '" .. credentials.username .. ":" .. credentials.password .. "' -H 'Content-Type: application/json; charset=utf-8' -H 'X-Apple-Find-Api-Ver: 2.0' -H 'X-Apple-Authscheme: UserIdGuest' -H 'X-Apple-Realm-Support: 1.0' -H 'User-agent: Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)' -H 'X-Client-Name: iPad' -H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' -H 'Accept-Language: en-us' -H 'Connection: keep-alive' https://fmipmobile.icloud.com/fmipservice/device/" .. credentials.username .."/initClient"
    local handle = io.popen(stage1command)
    local result = handle:read("*a")
    handle:close()

--    stage2server = string.match(result, "X%-Apple%-MMe%-Host%:%s(.*%.icloud%.com)")
    stage2server = "p43-fmipmobile.icloud.com"
    stage2command = "curl -sk -X POST -L -u '" .. credentials.username .. ":" .. credentials.password .. "' -H 'Content-Type: application/json; charset=utf-8' -H 'X-Apple-Find-Api-Ver: 2.0' -H 'X-Apple-Authscheme: UserIdGuest' -H 'X-Apple-Realm-Support: 1.0' -H 'User-agent: Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)' -H 'X-Client-Name: iPad' -H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' -H 'Accept-Language: en-us' -H 'Connection: keep-alive' https://" .. stage2server .. "/fmipservice/device/" .. credentials.username .."/initClient"
    local handle = io.popen(stage2command)
    local result = handle:read("*a")
    handle:close()


    output = json:decode(result)

    for key,value in pairs(output.content) do
      if value.name == credentials.devicename then
        lon = value.location.longitude
        lat = value.location.latitude
        bat = value.batteryLevel * 100 / 1
        powerstateval = value.batteryStatus
        table.insert(commandArray,{['UpdateDevice'] = otherdevices_idx['Iphone battery ' .. user] .. '|0|' .. bat})
        distance = math.sqrt(((lon - homelongitude) * 111.320 * math.cos(math.rad(lat)))^2 + ((lat - homelatitude) * 110.547)^2)  -- approximation
        table.insert(commandArray,{['UpdateDevice'] = otherdevices_idx['Positie ' .. user] .. '|0|' .. math.floor(distance*100+0.5)/100})
        print('iPhone ' .. user .. ': ' .. math.floor(distance*100+0.5)/100 .. ' km from home')
        if distance < radius  then
          if otherdevices['Iphone ' .. user] == 'Off' then
            commandArray['Iphone ' .. user] = 'On'
            -- table.insert(commandArray, {['SendNotification'] = 'Presence update#' .. user .. ' komt thuis'})
          end
        else
          if otherdevices['Iphone ' .. user] == 'On' then
            commandArray['Iphone ' .. user] = 'Off'
            -- table.insert(commandArray, {['SendNotification'] = 'Presence update#' .. user .. ' gaat van huis'})
          end
        end
      end
    end
  end

end

return commandArray
  [/font][/size]
10
PHP / Notificatie voor het ophalen v...
Laatste bericht door Joost - 20 maart 2021, 07:17:23
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);
}
?>

Pagina's1 2 3 ... 10