modifzierte URL in webfront aufrufen - Wie?

Das wäre genial!
Ich nutze das Astromodul schon seit anfang an, wäre eine super ergänzung!
Mfg
Maxx

Dann muss nur Piiti schreiben was er da genau gemacht hat ;-). Daten wie Lokation liegt ja so oder so im Astronomiemodul vor, vielleicht kann ja Pitti schreiben was zu ergänzen ist die paar Parameter im Konfigurationsformular kann man ja dann ergänzen, sind ja dann nur optional zwei Variablen mehr.

Also was ich gemacht habe ist schnell erklärt :wink:

1.) PhantomJS installieren


sudo apt-get install libfontconfig1
cd /usr/local/share
sudo git clone https://github.com/piksel/phantomjs-raspberrypi.git
sudo chmod -x ./phantomjs-raspberrypi/bin/phantomjs
sudo chmod 775 ./phantomjs-raspberrypi/bin/phantomjs
sudo ln -sf /usr/local/share/phantomjs-raspberrypi/bin/phantomjs /usr/local/bin

2.) Rendering einstellen


cd /var/lib/symcon/webfront/user
sudo mkdir sunrun
cd sunrun
sudo vi render.js

Folgenden Inhalt in die Datei kopieren:


var system = require('system');
var page   = require('webpage').create();
// system.args[0] is the filename, so system.args[1] is the first real argument
var url    = system.args[1];
// render the page, and run the callback function
page.viewportSize = { width: 1024, height: 1024 };
page.clipRect = { top: 325, left: 300,  width: 425, height: 425 };
page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit(1);
    } else {
        window.setTimeout(function () {
            page.render('/var/lib/symcon/webfront/user/sunrun/sonnenverlauf.jpeg', {format: 'jpeg', quality: '100'});
            phantom.exit();
        }, 1000);
    }
});


Speichern und vi schließen (Shift-Doppelpunkt, w,q, Enter)

3. IPS Script erstellen und konfigurieren


<?php
################################################################################
# Script:  Weather.Sunrun.ips.php
# Version: 1.0.20200227
# Author:  Heiko Wilknitz (@Pitti)
#
# Changelog:
#   27.22.2020 - Initialversion
#
# Installation:
#    Script in der Konsole ausführen
#
# ------------------------------ Konfiguration ---------------------------------
# Debug Mode
$debug = false;
#
# sonnenverlauf.de API URL
# https://sonnenverlauf.de/#/lat,lon,zoom/date/time/objectlevel/maptype
#
# Latitude (eigene eintragen)
$lat = '50.0000';
# Longitude (eigene eintragen)
$lon = '10.0000';
# MapZoom
$zoom = 19;
# Date (YYYY.MM.DD)
$date = date("Y.m.d", time());
# Zeit (HH:mm)
$time = date("H:i", time());
# Objectlevel
$level = 324;
# Map Type
$map =1;
# Zusammengebaute URL
$url = "https://www.sonnenverlauf.de/#/$lat,$lon,$zoom/$date/$time/$level/$map";
#
# Image Source
$img = '<img src="/user/sunrun/sonnenverlauf.jpeg" />';
#
# Update Interval
$update = 15;
#
# System Kommando (PhantomJS)
$cmd = 'phantomjs ' . IPS_GetKernelDir() . 'webfront/user/sunrun/render.js ' . $url;
#
################################################################################

if ($_IPS['SENDER'] == "Execute") {
    $vid = CreateVariableByName($_IPS['SELF'], 'Aktuelle Position', 3, 0, 'Sun', '~HTMLBox');
    SetValue($vid, $img);
    $eid = CreateTimerByName($_IPS['SELF'], "Update Timer", $update, true); 
}
if ($_IPS['SENDER'] == "TimerEvent") {
    $ret = exec("$cmd", $out, $rc);
    if($debug) {
        echo $cmd . PHP_EOL;
        var_dump($ret); // last output line
        var_dump($out); // last output line
        var_dump($rc);  // int(0)
    } 
}

# ------------------------------ Funktionen ------------------------------------

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ {type}
// Existiert die Variable schon wird diese zurückgeliefert.
// {type}   : 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
// {pos}    : 0 gleich Standardposition, sonst neue Sortierreihenfolgenummer 
// [icon}   : Zuweisung eines Icons mit dem Namen {icon}
// {profil} : leer für kein Profil, sonst Profilnamen 
// {action} : Script-ID für Auslösung via Webfront 
function CreateVariableByName($id, $name, $type, $pos = 0, $icon = '', $profile = '', $action = null) 
{
    $vid = @IPS_GetVariableIDByName($name, $id); 
    if($vid===false) {
        $vid = IPS_CreateVariable($type); 
        IPS_SetParent($vid, $id); 
        IPS_SetName($vid, $name); 
        IPS_SetPosition($vid, $pos); 
        IPS_SetIcon($vid, $icon);
        if($profile !== '') { 
            IPS_SetVariableCustomProfile($vid, $profile); 
        }
        if($action != null) {
            IPS_SetVariableCustomAction($vid, $action);
        }
    }
    return $vid; 
}

// Erzeugt einen Timer unterhalb {id} mit dem Namen {name} um die Zeit {time}
// Existiert das Event schon wird diese zurückgeliefert.
// Tägliche Ausführung: $time in Minuten
// Einmalige Ausführung: $time mit mktime(hour, minute, second) übergeben.
function CreateTimerByName($id, $name, $time = 0, $repeat = true)
{
    $eid = @IPS_GetEventIDByName($name, $id);
    if(($eid===false) && ($time > 0)) {
        // Eventtyp = Zyklisch (1)
        $eid = IPS_CreateEvent(1);
        IPS_SetParent($eid, $id);
        IPS_SetName($eid, $name);
        IPS_SetPosition($eid, -1);
        IPS_SetHidden($eid, true);
        if($repeat == true) {
            // 0 = Tägliche Ausführung
            IPS_SetEventCyclic($eid, 0, 1, 0, 0, 2, $time);
            $now = time();
            IPS_SetEventCyclicDateFrom($eid, (int)date('j',$now), (int)date('n', $now),  (int)date('Y', $now));
        } else {
            // Einmalige Ausführung
            IPS_SetEventCyclic($eid, 1, 0, 0, 0, 0, 0);
            IPS_SetEventCyclicDateFrom($eid, (int)date('j',$time), (int)date('n', $time),  (int)date('Y', $time));
            IPS_SetEventCyclicDateTo($eid, (int)date('j',$time), (int)date('n', $time),  (int)date('Y', $time));
            IPS_SetEventCyclicTimeFrom($eid, (int)date("H", $time), (int)date("i", $time), (int)date("s", $time));
            IPS_SetEventCyclicTimeTo($eid, (int)date("H", $time), (int)date("i", $time), (int)date("s", $time));
        }
        IPS_SetEventActive($eid, true);
    }
    return $eid;
}

################################################################################
?>

4. Visu anlengen /verlinken

Variable „Aktuelle Position“ ins Webfront verlinken

FERTIG

Viel Spaß
Heiko

Hi cbeham,

Sowas wie PhantomJS hat mich schon lange interessiert - ist doch was Nettes bei „abgefallen“ :smiley:

Beruflich … IPS Scripte … nein, aber Internet-Zeugs schon :loveips:

Gruß Heiko

Das wäre natürlich auch genial!

Auf alle Fälle Danke an Alle.

Hi Fonzo, hast du da schon ein Update bezüglich der Sonnenstandsanzeige?

Vielen Dank für die Rückmeldung und lg

Sorry das ich so blöd frage, aber leider habe ich mehr oder minder ja null Ahnung von der ganzen Materie.
Wie funktioniert denn Punkt 4 „Visu anlegen“ ? Muss ich da aus Google Maps den Bereich mit dem Haus ausschneiden oder wie muss ich das genau verstehen?

Danke

Nein, wenn Du alle anderen Punkte erfolgreich erledigt hast einfach die vom Script erstellte Variable „Aktuelle Position“ per Link ins WebFront an gewünschter Stelle einhängen!

Gruß Pitti

Pitti, hast du eine Ahnung ob Fonzo das jetzt in sein Modul integriert. Ansonsten nehem ich auch deine Variante…

lg

Nein, frag ihn doch mal im Chat - ist dort oft aktiv!

Nimm mal die von Pitti, so auf die schnelle werde ich da nichts ergänzen, da das mit phantomjs dann doch komplexer wäre so was in das Modul einzubauen.

Danke für die Info. lg

hey pitti,

ich hab kein jpeg!

Sieht so aus:

Danke!

Edit:
Ich glaube ich habs gefunden. der vi macht mich verrückt. er kopiert immer die erste zeile nicht vollständig und einfügen geht auch nicht…

Bei vi immer schön vor dem Einfügen „i“ drücken :slight_smile:

Danke! Ich habe mir erlaubt nano zu verwenden, war kurz davor den laptop aus dem fenster zu werfen :banghead:

Danke es geht!!! Du bist der Held

Noch eine Frage:

Sieht gerade so aus:

war nur temporär. ist auch schon wieder weg…
auf jeden fall ein traum!!!

Gratuliere :loveips:

Pitti, noch eine Bitte/Frage:

Das Bild aktualisert sich leider nicht von selbst, also ich muss die Seite neu laden, dann schon.
Gibt es eine einfache Möglichkeit in Webfront, oder in deinem Skript, das Image alle 15 Minuten im Webfront zu aktualisieren

Merci!

Lässt Du ständig die Seite mit dem Bild stehen? Bei mir wird bei Wechsel auf den Tab das letzte Bild angezeigt!

Ansonsten musst Du aller 15 min das HTML „touchen“ damit das Webfront denkt es hat sich was verändert und die Seite updatet!

Ciao Heiko

Ja meistens, leider wird bei einem Menüwechsel das Bild nicht aktualisiert…
Wie könnte denn so ein „touchen“ aussehen :wink:

Moin,

ich habe bei der Generierung des Bildes einfach am Dateinamen ein Timestamp gehangen. Somit ist der Inhalt immer neu und auch für den Browser ist das ein „neues“ Bild und er aktualisiert das. läuft die letzten Tage auch soweit gut.

Gruß
Thomas