Batterie leer ? Hier noch Script dafür ;-)

Hi ich habe mich mal versucht ein Script zu schreiben, was die Batterie Variable versteckt, wenn die Batterie ok ist und Sie anzeigt, wenn die Batterie leer ist.

Dann kann man einstellen, ob man eine Email und / oder Push Benachrichtigung bekommen will.

Handhabung ist sehr einfach ! Ein neues Script erstellen, alles löschen in dem Script und den kommenden Inhalt einfach rein kopieren und 1 x ausführen.

<?
$push=false; // Pushversand: aktiviert = true, deaktiviert = false

$email=true; // Emailversand: aktiviert = true, deaktiviert = false


/// AB hier nichts mehr ändern !!!

//  Webfront und SMTP ID herrausfinden
foreach(IPS_GetInstanceList ( ) as $m_id)// Durchsucht alle Instanzen und gibt die INstanzid an $i_id weiter
{
$typ=IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; // Fragt die Instanzen nach den Modulnamen ab....
if ($typ=="SMTP") $smtp_id=$m_id; // Wenn die INstanz den Modulnamen "SMTP" hat, dann schreibe die ID in $smtp_id
if ($typ=="WebFront Configurator") $wf_id=$m_id;// Wenn die INstanz den Modulnamen "WebFront Configurator" hat, dann schreibe die ID in $WF_ID
}

$id=@$_IPS['VARIABLE']; // Welche Variable hat das Script ausgelöst
$instanz_id = IPS_GetParent($id);// ID des übergeordneten Objekt (Instanzname) herausfinden
$raum=IPS_GetParent($instanz_id);// ID des übergeordneten Objekt (Raum) herausfinden
$instanz_name=IPS_GetObject($instanz_id)['ObjectName']; // Name der Instanz holen
$raum_name=IPS_GetObject($raum)['ObjectName']; // Name des Raumes holen
$status = @GetValue($id); // Status der Variable holen
$vtime=VarAktTime($id);

if ($vtime <= 1)
{
IF (@IPS_GetObjectIDByIdent("LOWBAT", $instanz_id)==true) // Wenn es eine LOWBAT Variable ist, dann
{
if ($status== false)$meldung2="ist wieder ok!"; // Meldung wenn die Batterie wieder OK ist
if ($status== false)IPS_SetHidden($id, true); // Setzt die Variable auf nicht sichtbar
if ($status== true) IPS_SetHidden($id, false); // Setzt die Variable auf  sichtbar
if ($status== true) $meldung2="ist leer, bitte wechsel die Batterien !"; // Meldung wenn die Batterie leer ist

if (($status ==false) or ($status ==true))
{
$betreff="miHome"; // Betreff der Push Nachricht
@$meldung="Die Batterie vom Gerät ".$instanz_name." ".$meldung2.""; // Meldung der Pushnachricht
if ($push ==true) WFC_PushNotification($wf_id , $betreff, $meldung, "Speaker", 0); // Senden der Push Nachricht
if ($email==true )SMTP_SendMail($smtp_id, $betreff, $meldung);  // Senden der Email Nachricht, wenn aktiviert ist !
}// Ende IF Status
}// Ende LOWBAT

IF (@IPS_GetObjectIDByIdent("BATTERY_STATE", $instanz_id)==true) // Wenn es eine STATE Variable ist, dann schreibe die ID in $id2
{
if ($status >= 2.6)IPS_SetHidden($id, true); // Setzt die Variable auf  sichtbar
//if ($status >= 2.6) $meldung2="ist wieder ok!"; // Meldung wenn die Batterie wieder OK ist
if ($status <= 2.0)  $meldung2="ist leer, bitte wechsel die Batterien !"; // Meldung wenn die Batterie leer ist
if ($status <= 2.0)IPS_SetHidden($id, false); // Setzt die Variable auf  sichtbar

if ($status <=2.0)
{
$betreff="miHome"; // Betreff der Push Nachricht
@$meldung="Die Batterie vom Gerät ".$instanz_name." ".$meldung2.""; // Meldung der Pushnachricht

if ($push ==true) WFC_PushNotification($wf_id , $betreff, $meldung, "Speaker", 0); // Senden der Push Nachricht
if ($email==true )SMTP_SendMail($smtp_id, $betreff, $meldung);  // Senden der Email Nachricht, wenn aktiviert ist !
}// Ende IF Status
}// Ende BATTERY_STATE



}// Ende IF vtime

//*********************** Ereignis generieren ******************

$scriptid=$_IPS['SELF']  ;


// AB hier nichts mehr ändern !!!

# Dieses Script durschsucht alle Instanzen nach dem Wort Fenster, und hängt das Script PUSH als 2 Ereignisse an die Variable Zustand...

foreach(IPS_GetInstanceList() as $i_id) // Alle INstanzen dursuchen
{

IF (@IPS_GetObjectIDByIdent("LOWBAT", $i_id)==true) // Wenn es eine STATE Variable ist, dann schreibe die ID in $id2
{
$id2=@IPS_GetObjectIDByIdent("LOWBAT", $i_id);
$iid=IPS_GetParent($id2);
$iname=IPS_GetName($iid);
GetOrCreateEvent("Batterie $iname", $id2,$scriptid);
}// Ende von IF

IF (@IPS_GetObjectIDByIdent("BATTERY_STATE", $i_id)==true) // Wenn es eine STATE Variable ist, dann schreibe die ID in $id2
{
$id2=@IPS_GetObjectIDByIdent("BATTERY_STATE", $i_id);
$iid=IPS_GetParent($id2);
$iname=IPS_GetName($iid);
GetOrCreateEvent("Batterie $iname", $id2,$scriptid);
}// Ende von IF
} // Ender der Schleife




function GetOrCreateEvent($name, $vid, $scriptid)  // erstellt ein Event, wenn es noch nicht exestiert
// Erstellt ein Event, Wert 1 = Name , Wert 2 ist die VariableID, wo das Event angelegt werden soll, Wert 3 ist das Script was das Event auslösen soll

{
    $ObjId = @IPS_GetObjectIDByName($name , $scriptid);
    if ($ObjId === false)
    {
	     $ObjId = IPS_CreateEvent(0);
	     IPS_SetEventTrigger($ObjId, 1, $vid); // 0 	Bei Variablenaktualisierung, 1 	Bei Variablenänderung,2 	Bei Grenzüberschreitung. Grenzwert wird über IPS_SetEventTriggerValue festgelegt, 3 	Bei Grenzunterschreitung, 4 	Bei bestimmtem Wert
        IPS_SetName($ObjId, $name);
		  IPS_SetParent($ObjId, $scriptid);//Ereignis zuordnen
        IPS_SetEventActive($ObjId, true);             //Ereignis aktivieren
	 }
    return $ObjId;
} //Ende der Funktion GetOrCreateScript

function VarAktTime($varID)
{
    $var = @IPS_GetVariable($varID)['VariableChanged'];
    $aktule_zeit=time(); // Aktuelle Zeit in Unixzeit ausgeben
    $unterschied=$aktule_zeit - $var; // Differrenz von aktueller Uhrzeit und Variabelupdate in Unixzeit
    $uzeit=date("d", $unterschied); //Unixzeit in Minuten umrechnen


    return ($uzeit);
}// Ende Funktion VarAktTime
?>

Das Script erstellt automatisch die Notwendigen Ereignisse (Events) und verknüpft Sie mit diesem Script…

Bis jetzt habe ich nur die HM Batterie Variablen implementiert, wer andere Systeme integriert haben möchte kann mir gerne eine PM schicken :wink:

Von Chris gibt es jetzt ein schönes Modul:
https://www.symcon.de/forum/search.php?searchid=3346817

Vielleicht könnt ihr ja eure Aktivitäten verbinden

Man muss aber deshalb nicht alle Skripte aus dem Forum verbannen :wink:
Aus Skripten können die Leute viel mehr lernen, sich Teile abschauen, …

Deshalb bitte NIE aufhören Skripte wie diese zu posten!!! :slight_smile:

Danke und Grüße,
Chris

Hi danke für den Hinweis, aber wir haben verschiedene Ansätze…

Da bin ich voll deiner Meinung… Ich habe alles nur von Scripten von anderen gelernt ! Es ist so extrem hilfreich, wenn man sich Beispiele von anderen anschaut um seine eigenes Brett vom Kopf weg zu scripten :wink:

if ($vtime <= 1)

sollte es wohl heissen ?!

Warning: Variable #0 existiert nicht in C:\IP-Symcon\scripts\38493.ips.php on line 104
kommt noch als Fehlermeldung

setz doch noch die eckige Klammer: ?>/PHP] am Ende

So habe es nochmal neu rein kopiert… hoffe das Fehler weg ist…

Habe aber noch einen Fehler drin, den nicht weg bekomme:

Die blöden neuen HM Aktoren Daten ständig die Variable Batteriespannung ab, das nervt, wie soll man den dann prüfen ob Sie leer oder voll ist ?

Klar könnte man ein Ereignis für Grenzunterschreitung und eins für Grenzüberschreitung machen, das ist aber blöd :rolleyes:

Hat einer eine Idee wie man dan noch abfangen kann (ohne zusätzliche Variablen) ?

Ich habe erstmal die Benarichtigungen „wieder OK“ für die neuen HM Geräte mit der Batteriespannung ausgeschaltet…

Was meinst du ? Ist der Fehler immer noch da ?

Da bleibt dir nur ein Event mit Variablenänderung und direkt am Anfang vom Skript $_IPS[‚VALUE‘] „prüfen“ und dann das Skript sauber beenden mit „return“ oder im Skript mit dem Wert weiter arbeiten, wenn er „relevant“ ist…

-Chris-

Hm, das Event ist ja schon auf Variablenänderung gestellt :wink:

Mit $_IPS[‚VALUE‘] bekomme ich doch auch nur den Wert raus, der wiederholt von HM reingeschrieben worden ist :frowning:

Hier ein Bespiel (übertrieben!):

2015-12-27 10:05 2,9V
2015-12-27 10:10 2,9V
2015-12-27 10:15 2,9V
2015-12-27 10:20 2,9V
2015-12-27 10:25 2,9V
2015-12-27 10:30 2,9V

Wie soll man das den Abfangen ?

Und wenn wir schon dabei sind, vielleicht kann mir da auch jemand einen Denkanstoß geben:

Warning: Variable #0 existiert nicht in C:\IP-Symcon\scripts\38493.ips.php on line 104

fehler ist jetzt wech…:smiley:

Wenn du wirklich auf VariablenÄNDERUNG triggerst mit dem Event, dann wird das Skript nur ausgeführt, wenn die Variable sich ÄNDERT! Wenn HM immer wieder 2,9V rein schreibt, dann wird das Skript nur beim 1. Mal mit „2.9V“ ausgeführt! Wird dein Skript jedes Mal ausgeführt, dann triggerst du auf VariablenAKTUALISIERUNG…und das wäre falsch…

Grüße,
Chris

Siehe Bild :slight_smile:

Man kann es auch abfragen :wink: