ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

Benutzeravatar
Sanys
Beiträge: 270
Registriert: 31.01.2007, 12:29
Wohnort: Wetterau

ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von Sanys » 12.08.2008, 12:16

Hallo zusammen,

Studio-Anwendungen haben den "Nachteil", daß man, um für Testzwecke oder auch im Regelbetrieb, Variablenwerte nicht einfach ändern kann. Sicherlich kann man eingabefelder programmieren, das ist aber mit gewissem Aufwand verbunden. Vielleicht ist es aber auch unerwünscht, wenn die Familie die Programmierung ändert, gleichzeitig ist sie unzufrieden, wenn das Lich mal wieder nicht an ist, wenn es soll, oder umgekehrt. Weiterhin soll natürlich die Steuerung 24/7 laufen...

Eine Möglichkeit: über ein ini-file (simple Text-Datei) werden Werte zugewiesen. Dazu bietet php den netten Befehl "parse_ini_file", der eigentlich genau das macht.

Beispiel: in einer Textdatei "Studio.ini" steht folgendes:
[allgemeine Parameter]
Parameter1 = 123
Parameter2 = 456
; dies ist ein Kommentar

In Studio wird ein Makro geschrieben (z.B. Objekt inilesen, Typ Knopf, Bildschirmeingabe möglich

Code: Alles auswählen

<?
// Datei Studio.ini lesen:
$ini_array = parse_ini_file ( 'c://Pfad zur Datei//Studio.ini' );

// Auswerten falls datei lesbar, sonst Standardwerte setzen
if ($ini_array){

$V_Objektxy_Parameter1 = $ini_array[Parameter1];
$V_Objektza_Parameter2 = $ini_array[Parameter2];

} else {

$V_Objektxy_Parameter1 = 123;
$V_Objektxy_Parameter2 = 456;

}

?>

starte(MakroZumAnzeigenDerWerte)


Zuerst wird überprüft, ob die Datei gelesen worden ist. Wenn ja ist ini_array ein array, welches sämtliche Werte der Datei enthält, jeweils mit dem Namen als Index. Somit ist der Zugriff auf jeden Wert direkt möglich, unabhängig in welcher Zeile der Datei der Wert stand.
Sollte etwas beim einlesen schiefgegangen sein werden einfach Standard-Werte in die Variablen geschrieben (der Teil nach dem else). Es könnte z.B. sein, das die Datei beim ändern nicht richtig geschrieben wurde oder gar fehlt.

Meine ini-Datei wird z.B. vom Makro *init gelesen, ebenso ist es möglich, die datei jederzeit zu lesen, allerdings muß meine Anwendung auf "Wartung" gestellt sein (das weiß z.B. meine Familie nicht, wie es geht und wo man das macht, ebenso werden erst dann die Möglichkeiten wie ini-lesen sichtbar.

Somit läßt sich die Anwendung im Betrieb recht komfortabel "umsteuern".


Eine weitere Anwendung ist das Auslesen von Daten, wenn ein externes Programm seine Daten so ablegt.


Ach ja, php muß natürlich für Studio installiert sein.... :idea:



Viel Spaß damit.


Sanys
FHZ 1350PC Prof. mit HomeputerStudio 100224 + Direktsendebefehle à la tsa (v 8.0)
WIN XP Pro SP3 (neuester Stand) + buempi's Minibrowser + etliche fs20+HMS+FHT Komponenten + nie genug Zeit, das alles fertig zu bekommen ;-)

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von mfreye » 24.04.2009, 16:17

Hallo Sanys,

habe mal eine Frage zu dem Script.

Code: Alles auswählen

[allgemeine Parameter]
Parameter1 = 123
Parameter2 = 456
; dies ist ein Kommentar
mit $V_Objektxy_Parameter1 = $ini_array[Parameter1] wird der Wert gelesen, soweit ist es klar.


Wenn ich jetzt aber z.B die folgende ini habe:

Code: Alles auswählen

[allgemeine Parameter]
Parameter1 = 123
Parameter2 = 456
[Bildgröße]
Parameter1 = 123
Parameter2 = 456
; dies ist ein Kommentar
mit $V_Objektxy_Parameter1 = $ini_array[Parameter1] würde jetzt wahrscheinlich der erste Wert gelesen oder kann an auch erst nach "Bildgröße" suchen und dann den entsprechen Wert dazu lesen?

Gruß
Maik

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von tsa » 24.04.2009, 21:46

Wenn ich mal antworten darf...

Das geht auch:

Code: Alles auswählen

.
$ini_array = parse_ini_file("z:\\fs20\\SPG\\Haussteuerung.ini", TRUE);

// Auswerten falls Datei lesbar, sonst Standardwerte setzen
if ($ini_array)
{
  $Info = "Ini-Lesen erfolgreich!";
  //Beschattung
  $V_Option_Beschattung = $ini_array[Beschattung][Automatik];
  $V_Option_BeschattungLogging = $ini_array[Beschattung][TemperaturLog];
 ...
  //Weihnachtslichter
  $V_Option_Weihnachtslichter = $ini_array[Weihnachtslichter][Automatik];
}
else
{
  $Info = "Ini-Lesen fehlgeschlagen!";
  //Beschattung
  $V_Option_Beschattung = 1;
  $V_Option_BeschattungLogging = 0;
...
  //Weihnachtslichter
  $V_Option_Weihnachtslichter = 0;
}

//Kommazahlen korrigieren
$V_Option_Beschattung = str_replace(".", ",", $V_Option_Beschattung);
$V_Option_BeschattungLogging = str_replace(".", ",", $V_Option_BeschattungLogging);
...
$V_Option_Weihnachtslichter = str_replace(".", ",", $V_Option_Weihnachtslichter);
...
Hier die zugehörige INI:

Code: Alles auswählen

[Beschattung]
Automatik=1
TemperaturLog=0
...

[Weihnachtslichter]
Automatik=0
...
Gruss
Thomas

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von mfreye » 24.04.2009, 22:19

Hallo Thomas.
Wenn ich mal antworten darf...
Warum nicht ;)

Danke für die schnell Antwort und Hilfe.

Wenn ich es schaffen werde, werde ich das ganze morgen testen.

Gruß
Maik

Benutzeravatar
Sanys
Beiträge: 270
Registriert: 31.01.2007, 12:29
Wohnort: Wetterau

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von Sanys » 24.04.2009, 22:34

Hallo Maik,

Thomas hat ja schon geschrieben, dass es geht. Ein wenig mehr zum WIE findest Du hier:
http://de.php.net/manual/de/function.parse-ini-file.php

Du hast halt für diesen Fall ein mehrdimensionales Array, welches die Parameter enthält.


Viele Grüße


sanys
FHZ 1350PC Prof. mit HomeputerStudio 100224 + Direktsendebefehle à la tsa (v 8.0)
WIN XP Pro SP3 (neuester Stand) + buempi's Minibrowser + etliche fs20+HMS+FHT Komponenten + nie genug Zeit, das alles fertig zu bekommen ;-)

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von mfreye » 25.04.2009, 06:48

Hallo zusammen.

Danke so läuft es wunderbar.
Ja dort hatte ich schon geschaut, aber kam nicht auf die folgende Zeile:

Code: Alles auswählen

  $V_Option_BeschattungLogging = $ini_array[Beschattung][TemperaturLog];
Hatte das immer gedacht, dass [Beschattung][TemperaturLog] in einer Klammer stehen müssten. Aber ist so logischer.

Danke.

Gruß
Maik

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von mfreye » 22.06.2009, 17:56

Hallo,

nach langer Zeit bin auch mal wieder im Lande und habe gleich noch ne Frage.

Kann ich das ganze auch noch weiter verschalteten?

Also so in etwa:

[01.01.2009]
[09:00]
KuecheLicht = an
[09:20]
KuecheLicht = aus



[02.01.2009]
[09:00]
KuecheLicht = an
[09:20]
KuecheLicht = aus

Danke wieder einmal für Eure Hilfe!

MfG
mfreye

PS bumpi deine MiniBrowser echt geil gemacht! Wenn ich Zeit habe wäre das bestimmt was für mich :)

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von buempi » 22.06.2009, 20:43

Hallo Maik

Auf die Gefahr hin, dass mir jemand widerspricht: Ich kann mich nicht erinnern, je INI-Dateien mit Untersektionen gesehen zu haben. Deshalb dürfte die Auswertung mit einer einfachen Funktion wie parse_ini_file() nicht möglich sein.

Man müsste die INI also mit den verschiedenen String-Funktionen von PHP selbst zerpflücken. Das ist sicher machbar. Sektionen und Untersektionen sollten sich dann aber durch eine andere Art Klammer unterscheiden. Aber warum baust du die INI nicht einfach so auf?

Code: Alles auswählen

[01.01.2009-09:00]
KuecheLicht = an
[01.01.2009-09:20]
KuecheLicht = aus
Hast du auch schon an die Anschlussauswertung gedacht? Du musst ja unter jeder Uhrzeit alle in Frage kommenden Aktoren abfragen. Gibt's da für einen Aktor unter 01.01.2009-09:00 keinen Eintrag, kommt vermutlich "" zurück. - Und das würde zum Ausschalten des Aktors führen (oder zum Absturz von PHP unter Homeputer)! Ich würde also in PHP zunächst nicht die wirklichen Aktor-Bezeichnungen verwenden, sondern irgend ein Zeichen voranstellen und nur eine Zuweisung vornehmen, wenn der Wert nicht "" ist.

Viele Grüsse
Bümpi

PS: Herzlichen Dank für das Kompliment betreffend MiniBrowser. - Ich gebe zu: Bin auch echt ein Bisschen stolz drauf!

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von mfreye » 12.07.2009, 20:31

Hallo zusammen!

Also buempi will mal kurz schreiben was ich vor habe, leider habe ich zur Zeit nicht viel Zeit dafür, deshalb auch meine Späte Antwort.

Ich möchte automatisch eine Textdatei (ini) erstellen und diese soll dann jede Minute abgerufen werden.

Hier mal ein kurzer Ausschnitt von der erzeugten Datei:

Code: Alles auswählen

--------------------------------------------------------------------------------
Titel:                   Raumreglerdaten Badezimmer
Path:                    C:\xTEST\
File:                    Raumregler3.ini

Erstellungsdatum:        12.07.2009
Erstellungsuhrzeit:      19:38:33
Benutzername (Maschine): Administrator

Copyright:               (C) 2009 Maik Freye
--------------------------------------------------------------------------------


[12.07.2009/07:30:00]
      Modus1 = "Maunell"
      Temperatur1 = "20"
[12.07.2009/08:30:00]
      Modus1 = "Maunell"
      Temperatur1 = "17"
[12.07.2009/16:00:00]
      Modus1 = "Maunell"
      Temperatur1 = "18"
[12.07.2009/18:00:00]
      Modus1 = "Maunell"
      Temperatur1 = "23"
[12.07.2009/19:30:00]
      Modus1 = "Maunell"
      Temperatur1 = "20"
[12.07.2009/21:00:00]
      Modus1 = "Maunell"
      Temperatur1 = "14"

[13.07.2009/06:00:00]
      Modus1 = "Maunell"
      Temperatur1 = "20"
[13.07.2009/07:00:00]
      Modus1 = "Maunell"
      Temperatur1 = "14"
Außerdem soll das Programm für automatische Sicherungskopien und der gleichen gut sein. Hänge zur Zeit daran leere Ordner zu finden und diese dann zur löschen, aber VB ist noch etwas neuland für mich.

Code: Alles auswählen

                    Next SchleifeFile  'Schleife zum suchen nach Dateien
                Else  'Es wurde keine Datei gefunden
                    'MsgBox zur Ferhlermeldung ist nicht nötig, wenn keine Datei vorhanden dann Script beenden
                    'SimpleText schreiben Master
                    sMsg = "Datensicherung: Copyauftrag: """ & sCopy_Name & """ , keine zu verschiebenden Datei(en) gefunden. / Fehler (4)"
                    Form_F_HomeStudio_Einstellungsverwaltung_Master.stbStatusCopy.SimpleText = sMsg
                    GoTo abbrechen  'Aktion abbrechen
                End If
            End With
        Else  'wenn ein Zeitstempelordner erzeugen wird
            If b_Ziel_Verzeichnis_erw = True Then  'Alle Dateien und Ordner sollen in einen Ordner mit Zeitstempel verschoben werden
                CreateFolder sZiel_Verzeichnis & sNowPath 'Ordner mit Zeitstempel jetzt erstellen
            End If
            With Application.FileSearch  'Suche nach nach Datei starten
                ChDir sStart_Verzeichnis  'In das Quellenverzeichnis wechseln
                .NewSearch  'Neue Suche jetzt starten
                .LookIn = sStart_Verzeichnis  'Im Quellverzeichnis suchen
                .SearchSubFolders = False  'Suche im Unterordner True/False
                .filename = "*.*"  'welche Dateien sollen kopiert werden
                If .Execute > 0 Then  'Es wurden Datein gefunden
                    oFSO.MoveFile sStart_Verzeichnis & "*", sZiel_Verzeichnis & sNowPath  'Alle Dateien im Hauptverzeichnis verschieben
                End If
            End With
            FolderSearch = Dir(sStart_Verzeichnis, vbDirectory)  'Jetzt Verzeichnis zum durchsuchen von Ordnern angeben
            Do While FolderSearch = "." Or FolderSearch = ".."  'Aktuelles und übergeordnetes Verzeichnis ignorieren / überspringen
                FolderSearch = Dir$()  'Nächstes Verzeichnis auslesen
            Loop
            If FolderSearch <> "" Then  'Wenn Verzeichnis gefunden wurde
                oFSO.MoveFolder sStart_Verzeichnis & "*", sZiel_Verzeichnis & sNowPath  'Jetzt alle Ordner und Datein in den Unterordnern verschieben (auch leere Ordner werden kopiert)
            End If
        End If
    End If
End If

Set oFSO = Nothing

' Jetzt leere Ordner löschen
If bCopy_leere_Ordner_loeschen = True Then
    CleanupEmptyFolders sStart_Verzeichnis
End If

'SimpleText schreiben Master
sMsg = "Datensicherung: Letzter ausgeführter Copyauftrag: """ & sCopy_Name & """ um " & Time & " / " & Date
Form_F_HomeStudio_Einstellungsverwaltung_Master.stbStatusCopy.SimpleText = sMsg
    
    
abbrechen:
Exit Sub

Datei_kopieren_Exit:
  Exit Sub

Datei_kopieren_Error: 'Fehlerbehandlung
  sMsg = "Fehler in Datei_kopieren: " & Err.Description
  MsgBox sMsg, vbExclamation 'und anzeigen.
  Resume Datei_kopieren_Exit
End Sub

Public Sub CleanupEmptyFolders(ByVal strPath As String)


Set oFSO = CreateObject("Scripting.FileSystemObject")  'für Dateioperationen
Set fsofolder = oFSO.GetFolder(strPath)
Debug.Print fsofolder

For Each subFolder In fsofolder.SubFolders
    Call CleanupEmptyFolders(subFolder.path)
Next subFolder

If fsofolder.files.Count = 0 And fsofolder.SubFolders.Count = 0 Then
    fsofolder.Delete False
End If

Set oFSO = Nothing


End Sub
Evt. kennt sich buempi damit ja auch aus?

Habe noch zwei Problem mit dem Unterprogramm CleanupEmptyFolders, wenn es am Quellordner angekommen ist kommt es zu einem Fehler das wohl keine Ordner mehr im Quellordner sind und außerdem möchte ich das ganze nicht als Unterprogramm starten, aber dann läuft es nicht.

Später soll das Programm dann noch aktuelle Werte wie Temperatur, .... auswerten und Zustände anzeigen, die ich nicht umbedingt in der Visualisierung von homestudio brauche. Könnte man dafür die Erweiterung "dll" von contronics nehmen?

Vielleicht ist es ja für den einen oder anderen Interessant und evt. kennt buempi sich ja auch mit VB (würde ich bald behaupten :wink: ) aus.

So jetzt noch einen schönen Abend.

MfG
mfreye
Dateianhänge
3.JPG
Kopieraufträge
2.JPG
Voreinstellungen für die Automatischer Erstellung der Tabellen
1.JPG
Aktuelle Einstellungen der Temperaturen

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: ini-Datei auslesen, Parameter an Studio-Anwendung übergeben

Beitrag von buempi » 13.07.2009, 14:00

Hallo Maik

Da hast du dir ja ein gewaltiges Projekt vorgenommen! Ich hätte vermutlich einen anderen Weg beschritten und aus Visual-Basic heraus die Steuerbefehle über ExecStudioCo.exe an Homeputer weitergegeben. Aber deine Variante funktioniert sicher auch. Homeputer muss einfach für jeden in Frage kommenden Aktor jede Minute ein kleines PHP-Skript ausführen. Das sollte die Performance nicht allzu stark beeinträchtigen.

Toll, was du mir alles zutraust! - Leider kenne ich mich mit VB nur so weit aus, wie es nötig ist, um aufgezeichnete Skripts in Word oder Excel zu "verfeinern". Auch sind wir hier ja nicht in einem VB-Forum...

Trotzdem habe ich mir die Funktion mal installiert. Sie lief anfänglich auch nicht. Dann habe ich herausgefunden, dass die SCRRUN.DLL (Microsoft Scripting Runtime) im System32-Verzeichnis eingebunden werden muss um FileSystemObjecte erzeugen zu können. Im Visual-Basic-Editor meines uralten Word2000 macht man das über Extras/Verweise.

Dann lief es zunächst mal. Sobald das Skript aber auf ein leeres schreibgeschütztes Verzeichnis stösst, stürzt es beim Befehl "fsofolder.Delete False" ab. Vermutlich war das bei dir auch der Grund und nicht die "Ankunft" im Quellordner. Das ist nach meiner Meinung durch "For Each subFolder..." abgefangen.

Mit folgenden Änderungen funktioniert es bei mir:

Code: Alles auswählen

Public Sub CleanupEmptyFolders(ByVal strPath As String)

Set oFSO = CreateObject("Scripting.FileSystemObject")  'für Dateioperationen
Set fs   = CreateObject("Scripting.FileSystemObject")  'eingefügt von Bümpi

Set fsofolder = oFSO.GetFolder(strPath)
Debug.Print fsofolder

For Each subFolder In fsofolder.SubFolders
    Call CleanupEmptyFolders(subFolder.Path)
Next subFolder

If fsofolder.Files.Count = 0 And fsofolder.SubFolders.Count = 0 Then
    Set f = fs.GetFolder(fsofolder)                    'eingefügt von Bümpi
    If Not f.Attributes And 1 Then                     'eingefügt von Bümpi
       fsofolder.Delete False
    End If                                             'eingefügt von Bümpi
End If

Set oFSO = Nothing

End Sub
Gemäss Hilfetext müsste eigentlich das "False" verhindern, dass schreibgeschützte Verzeichnisse gelöscht werden. Warum das nicht funktioniert, durchschaue ich auch nicht.

Du könntest natürlich auch einfach "True" eintragen und so auch schreibgeschützte leere Verzeichnisse löschen. Funktioniert auch! Das würde ich dir aber abraten. Ja, ich frage mich sogar, ob es grundsätzlich sinnvoll ist, leere Verzeichnisse einfach so zu löschen.

Sehr oft stammen sie ja wirklich von irgendwelchen nicht sauber deinstallierten Programmen... Aber: Wenn nur ein einziges solches Verzeichnis zu viel gelöscht wird, stürzt irgendwann in ein paar Wochen vielleicht ein Programm mit einer irreführenden Fehlermeldung (Datei kann nicht gefunden werden, Datei kann nicht angelegt werden - Schreibschutz?) oder dergleichen ab. Mich stören solche leere Verzeichnisse (und 0-Byte-Dateien!) auch. Aber ich würde mich niemals trauen, mit so grobem Geschütz einfach alles zu löschen.

Das Skript kann übrigens deshalb nur als Unterprogramm aufgerufen werden, weil die Funktion sich selber aufruft! Ist übrigens ganz raffiniert ausgedacht! Die Verzeichnisse werden so "von hinten her" gelöscht. Normalweise werden ja Verzeichnisbäume von oben nach unten durchforstet. Hast du nun ein Verzeichnis, welches nur ein leeres Unterverzeichnis enthält, ist es ja zunächst nicht leer. Also wird es nicht gelöscht. Nachdem nun das leere Unterverzeichnis gelöscht ist, ist das "Oberverzeichnis" ja auch leer. Aber das würde stehen bleiben. Mit dieser Methode verschwinden aber beide!


Zu deiner Frage betreffend Verwendung der Contronics-DLL in Visual-Basic: Ich denke, dass das schon gehen müsste. Allerdings bietet Contronics selbst ja keinen Support dazu an. Und ob du bei allfälligen Problemen hier im Forum Hilfe findest, weiss ich nicht. Diese DLL scheint nicht allzu häufig verwendet zu werden. Jedenfalls gibt es so gut wie keine Beiträge dazu. Aber den 10-tägigen Gratistest kannst du ja alleweil mal machen...

Viele Grüsse
Bümpi

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“