Tempest

Neue Version Online

Vers. 3.1.3 vom 31.1.2021

-Fehlermeldung bei fehlendem Datenfeld für Blitze abgefangen
-Die Anzeige des Zeitpunkts vom letzten Blitz ist jetzt wählbar : $time_lapsed = false; // Blitz Anzeige bei True wird die vergangene Zeit seit dem letzten Blitz angezeigt, bei false das Datum

  • „<meta name=‚viewport‘ content=‚width=device-width,initial-scale=1,maximum-scale=1‘>“ zur Optimiereung mobiler Ansichten

https://www.symcon.de/forum/threads/42554-Tempest?p=447536#post447536

Danke @BestEx

Ich stehe nun vor einem anderen „Problem“.
Ich habe meine alte Konfiguration gespeichert. Da nun aber weder meine gespeicherte, noch „deine“ im Skript bei mir passt, stehe ich vor dem Problem: Wie bekomme ich meine alte Konfiguration wieder in das Skript, um diese zu ändern?
Ich müsste ja nun erst einmal alle Einstellungen im Skript wieder auf meine Einstellungen ändern (von Hand). Mit „Compare“ komme ich da auch nicht weiter. :frowning:
Mit „Detail“ bekomme ich zwar das Array mit den Parametern, ist aber dann auch wieder Handarbeit…

Die Idee, die Einstellungen in eine Variabel zu schreiben ist schon nicht schlecht, jedoch zur weiteren Bearbeitung nach Updates des Skripts nicht hilfreich. Die Konfiguration in ein separates Skript auszulagern und diese per include einzubinden, fände ich da besser.
Ist bei Updates, wenn sich Parameter ändern oder hinzukommen etwas Handarbeit, aber wie kann ich sonst bereits gespeicherte Konfigurationen nachträglich anpassen?

Irgendwann sollte man ja mal eine passende Konfiguration haben, dann wird das mit den Änderungen auch weniger. Da Tempest hier wohl auch noch Beta Status hat, bleiben Anpassungen da wohl nicht aus. :frowning:

Vielleicht gibt’s ja noch andere Vorschläge zur Umsetzung… :smiley:

Gruß
Rainer

@erpe Wenn ich dich richtig verstanden habe willst du bei einer gespeicherten Konfiguration nachträglich bestimmte werte verändern.

Dazu musst Du die Konfiguration laden und danach das entsprechende Feld manuell überschreiben (Nach Zeile 666) und mit der backup Funktion „configuration_back_up_handler($configuration_back_up_command,$config_name,$type);“

wieder abspeichern

Include hätte dir auch nicht geholfen da ja auch neue Variable hinzukommen

Sag bescheid ob es funktioniert hat. Ich kann auch eine Funktion dazu schreiben

@erpe Am einfachsten ist es wenn du Dein Backup im Texteditor anpasst. Ich poste nachher hier ein Skript

@erpe hat etwas länger gedauert aber das hier müsste funktionieren

1.) Speichern der Backup Dateien in eine Text Datei „Config.txt“ :

$config_var_id = xxxxx;

$data = unserialize(GetValueString($config_var_id));
file_put_contents("Config.txt",print_r($data,true));

2.) Du findest dann im Skript Ordner eine Text Datei Config.txt. Die öffnest Du mit einem simplen Text Editor und machst Deine Änderungen und speicherst das Ergebnis unter einem neuen Namen ab (Config1.txt)

Jetzt wird es etwas komplizierter. Das umwandeln der Text Datei in ein Array hat mich etwas Zeit gekostet aber auf Github wurde ich fündig :

// Other author's mod. Fix null values?
// original gist with other comments: https://gist.github.com/simivar/037b13a9bbd53ae5a092d8f6d9828bc3

/**
  * Matt: core
  * Trixor: object handling
  * lech: Windows suppport
  * simivar: null support
  *
  * @see http://php.net/manual/en/function.print-r.php
  **/
function print_r_reverse($input) {
        $lines = preg_split('#\r?
#', trim($input));
        if (trim($lines[ 0 ]) != 'Array' && trim($lines[ 0 ] != 'stdClass Object')) {
            // bottomed out to something that isn't an array or object
            if ($input === '') {
                return null;
            }
           
            return $input;
        } else {
            // this is an array or object, lets parse it
            $match = array();
            if (preg_match("/(\s{5,})\(/", $lines[ 1 ], $match)) {
                // this is a tested array/recursive call to this function
                // take a set of spaces off the beginning
                $spaces = $match[ 1 ];
                $spaces_length = strlen($spaces);
                $lines_total = count($lines);
                for ($i = 0; $i < $lines_total; $i++) {
                    if (substr($lines[ $i ], 0, $spaces_length) == $spaces) {
                        $lines[ $i ] = substr($lines[ $i ], $spaces_length);
                    }
                }
            }
            $is_object = trim($lines[ 0 ]) == 'stdClass Object';
            array_shift($lines); // Array
            array_shift($lines); // (
            array_pop($lines); // )
            $input = implode("
", $lines);
            $matches = array();
            // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
            preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            $pos = array();
            $previous_key = '';
            $in_length = strlen($input);
            // store the following in $pos:
            // array with key = key of the parsed array's item
            // value = array(start position in $in, $end position in $in)
            foreach ($matches as $match) {
                $key = $match[ 1 ][ 0 ];
                $start = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
                $pos[ $key ] = array($start, $in_length);
                if ($previous_key != '') {
                    $pos[ $previous_key ][ 1 ] = $match[ 0 ][ 1 ] - 1;
                }
                $previous_key = $key;
            }
            $ret = array();
            foreach ($pos as $key => $where) {
                // recursively see if the parsed out value is an array too
                $ret[ $key ] = print_r_reverse(substr($input, $where[ 0 ], $where[ 1 ] - $where[ 0 ]));
            }
           
            return $is_object ? (object)$ret : $ret;
        }
    }

3.) Der Rest ist jetzt einfach : Laden der Text Datei, dann umwandeln in ein Array, dann serialisieren und als String wieder abspeichern

$file = file_get_contents("Config1.txt");
$array = print_r_reverse($file);

SetValueString($config_var_id,serialize($array));

@BestEx

Danke für deine Arbeit.
Das Ganze ist nur etwas unpraktisch in der Handhabung.

Schau mal, ob du mit den Zeilen was anfangen kannst:

<?php
$config_var_id = 50318;
$data = unserialize(GetValueString($config_var_id));
$export = var_export($data, true);

//$ScriptID = IPS_CreateScript(0);
//IPS_SetName($ScriptID, "Config");
//IPS_SetParent($ScriptID, $_IPS['SELF']);

IPS_SetScriptContent(49855, '<?php

$config_data = '.$export.';'

);

$config_data = array('Test'=> 1);
$configuration_back_up_command = 'use';
if($configuration_back_up_command == 'use'){
    include("49855.ips.php");
}
else{
    
}
print_r($config_data);

damit kannst du die Konfigurationsvariable in ein Skript auslagern. Zum Testen habe ich mal meine Stringvariable eingelesen und das Array in ein Skript geschrieben. Das kann dann mit include wieder eingebunden werden oder du nutzt das Array aus dem original Skript. Die Größenbeschränkung wie bei Strings spielt dann auch keine Rolle mehr. Und alle Einstellungen sind dann in der Konsole editierbar.

Mit deinem original Skript Version 3.1.3 bekomme ich noch folgenden Fehler:

 Program executed using existing Configuration 

Warning:  array_key_exists(): The first argument should be either a string or an integer in C:\ProgramData\Symcon\scripts\27273.ips.php on line 1065

ich finde jedoch nicht die Ursache. :frowning:
Da muss es noch eine leere Variable geben :confused:

@erpe Gute Idee das Array in ein Script zu schreiben, hab ich erst später dran gedacht und wollte das eigentlich morgen ausprobieren aber so kann ich deinen Skriptteil nehmen Danke

Mit dem include kann ich mich immer noch nicht anfreunden da ich mit der jetzigen Methode relativ einfach die Darstellung umschalten kann aber du kannst das in deiner Installation ja so machen, mal schauen vielleicht spendiere ich eine weitere option :slight_smile:

Den Fehler habe ich beheben können. Ich schicke ja alle Datenfelder über translate und bei der „Menge Niederschlag“ kam ein Float Wert und den kann ich nicht als key für ein Array nehmen.

Der Niederschlagswert den Tempest schickt stimmt übrigens nicht : 225,4 mm am heutigen Tag hätten wir hier Hochwasser :frowning:

@BestEx
Mit dem var_export schreibst du doch auch die gesamte Konfiguration in das Skript, so wie serialize in die String-Variable.
Der Dateninhalt ist quasi identisch :wink:
Das include macht dann nichts anderes, als die Konfiguration wieder einer Variable zuzuweisen, in der auch alles steht, was du mit unserialize aus der String-Variable zurückholst. In meiner Skript-Variable steht ja auch noch dein ‚AF1‘ Teil z.B.
Das include dient auch nur der Variablenzuweisung mit dem „Inhalt“ aus dem Skript. Du kannst danach genau so auf die unterschiedlichen gespeicherten Konfigurationen umschalten.

<?
$export = var_export($data, true);
IPS_SetScriptContent(49855, '<?php

$config_data = '.$export.';'

);

ist auch nur:

$config_data = array(....)

wenn du das wie serialize mit allen Konfigurationsdaten verwendest.

was du dann mit include „wiederverwenden“ kannst.

Ich kenne nur keine andere einfachere Funktion, um den Inhalt aus dem Skript wieder in eine Variable zu schreiben.
Du musst dein Skript nicht groß ändern mit extra Optionen.

@erpe Ich habe über Deinen Vorschlag nachgedacht und ich denke/hoffe eine gute Lösung gefunden zu haben.

-Die neue Version ersetzt die serialisierte Variable durch ein „Configurations“ Skript als Speicher (nicht als Include file gedacht sondern als Speicher)
-Die Backup Befehle können bis auf den Befehl „Add“ weiterhin genutzt werden
-Änderungen der Konfiguration wie z.B. Ändern der Parameter oder erweitern der Array Struktur können direkt im Configurations Skript mit dem Symcon Skript Editor durchgeführt werden (Nochmals vielen Dank für den Tipp)

  • Um die alten Konfigurationen aus der seriellen Variablen in das Configurations Skript zu migrieren gibt es jetzt den Befehl „Migrate“

https://www.symcon.de/forum/threads/42554-Tempest?p=447536#post447536

@erpe ich bin gerade am Überlegen anstelle von Print_r json zu nehmen. Da sind die Daten in hoch komma das scheint übersichtlicher zu sein. Hilft bei Leerzeichen. Außerdem Spar ich mir die Print Reverse Funktion Was ist deine Meinung ?

Sent from my Pixel 4 using Tapatalk

@BestEx

Das hat mich an print_r auch gestört, aus dem Grund fand ich auch var_export($data, true) besser:

<?php

$config_data = array (
  'AF1' => 
  array (
    'hours' => 
    array (
      'color_label_background' => '5ba2ec80',
      'color_text_label' => 'FFFFFF',
      'color_column_text' => 'FFFFFF',
      'color_column_background' => '5ba2ec33',
      'border_color' => '80d7ff0F',
      'border' => 'collapse',
      'nr_of_forecasts' => 12,
      'intervall' => 1,
      'table_layout' => 'fixed',
      'tabellen_breite_in_przt' => true,
      'width' => 100,
      'fontSize' => 1.5,
      'font_size_scale_type' => 'vw',
      'wrap_label' => '',
      'wrap_column' => '',
      'border_size' => 1,
      'text_align' => 'left',
      'language' => 'German',
      'icon_height' => 40,
      'icon_width' => 40,
      'selector' => 'time',
      'type' => 'hourly',
      'dataset_id' => '',
      'VAR_Name' => 'Hourly Forecast',
      'parameter' => 
      array (
        'time' => 
        array (
          'German' => 'Zeit',
          'English' => 'Time',
          'Active' => false,
          'Suffix' => 
          array (
            'default' => '',
            'merge' => '',
          ),
          'Merge with' => 
          array (
            0 => '',
            1 => '',
          ),
        ),

da sind die bool und leere Strings auch sofort zu erkennen und es ist ein in PHP nutzbares Array ohne viel Konvertierung drum rum :smiley:
Ob es da für das von dir nicht gewollte include noch eine andere Lösung gibt, kann ich leider nicht sagen bzw. habe ich bisher noch nicht richtig gesucht. :frowning:
Was spricht für dich gegen include?

Wir sind beide hier ja auch sehr allein am diskutieren…

Was ich bisher zu var_export reverse gefunden habe nutzt auch nur include

Also zugehört wird Euch.

Ich finde es interessant, was ihr für Ideen entwickelt aber ob das nun links- oder rechtsherum gelöst wird, ist mir - in dem Fall als User - nicht so entscheidend. Hier gibt es ja unterschiedliche Präferenzen.
Viele Köche verderben manchmal den Brei.

Gesendet von iPhone XS mit Tapatalk

Ich poste später einen Update mit json und bringe noch ein paar Erklärungen in Bezug auf die Include Variante. Der Weg ist das Ziel :slight_smile:

Sent from my Pixel 4 using Tapatalk

Wir sind beide hier ja auch sehr allein am diskutieren…

Ihr werdet aber beachtet. Zum mitdiskutieren reichen meine Kenntnisse nicht. Aber beim testen bin ich noch dabei. :slight_smile:

Ich verfolge die Entwicklung hier sehr interessiert. Es tut sich ja immer mehr [emoji1]

Wird das Ganze irgendwann in einem Modul landen? Das wäre super, dann könnte es ja pareseys Modul ablösen.

Burkhard

Ein Modul zu bauen wäre schon reizvoll. Es wäre auch nicht mein erstes aber die vielen Parameter in Formulare zu bauen ist keine verlockende Aussicht

Sent from my Pixel 4 using Tapatalk

Noch ist der Interessentenkreis vielleicht klein, aber das Gerät ist spitze und wenn es demnächst nach Europa ausgeliefert wird, dann wird sich der Kreis sicherlich schnell erweitern.

So lohnt sich die Mühe bestimmt. Wenn du Unterstützung brauchst, dann bekommst du sie bestimmt [emoji1]

also wenn ich mir da Burkhard sein Blind Controller Modul anschaue, sind wir mit der Anzahl der Parameter nicht weit auseinander :smiley: :wink:

Rainer

Vers. 3.2.1 Online mit JSON Format für die Configurations Back ups

@erpe Die jetzige Lösung hat eine Reihe von Service Features (die ich regelmäßig nutze) die ich bei einer Include Lösung neu programmieren müsste.

Deine Kritik, das die Konfiguration`s Dateien nicht editierbar sind, habe ich konstruktiv aufgegriffen. Die jetzige Lösung ist auch Dank Deiner Hilfe viel besser als mein erster Wurf.

Ich kann im Moment nicht sehen welchen Vorteil eine Include Lösung gegenüber der jetzigen Umsetzung hätte und ich möchte ungern weiteren Aufwand in etwas stecken das aus meiner Sicht keine funktionale Verbesserung bringt. Das soll nicht heißen das ich nicht weiterhin an konstruktiver Kritik interessiert bin, durch Deine guten Hinweise sind wir ja ein ganzes Stück weitergekommen

PS. Vielen Dank an alle „Zuhörer“ für die ermutigenden Kommentare

@BestEx deine Argumentation gegen include hat mich überzeugt :slight_smile:
IPS_GetScriptContent hatte ich ganz übersehen und mit der JSON-Variante bin ich auch sehr zufrieden. Datenübernahme hat perfekt funktioniert.
Nun kann man am Design der Tabellen „feilen“

Wenn bei dir der Weg das Ziel ist, bist du auf der Zielgeraden :smiley:

Zwei winzige Korrekturen hätte ich noch:

  • ergänze bitte bei json_encode noch +JSON_UNESCAPED_UNICODE, dann sind die Umlaute auch lesbar,
  • beim Anlegen der Variablen könntest du noch alle, bis auf die drei Tabellen ausblenden, die „stören“ im Webfront (ja, kann man auch mal schnell alleine wegklicken) :wink:

Danke und Gruß
Rainer