Unnötig wenn du keinen Wert übergibst.
Michael
…ich möchte 3x96 Viertel-Stunden-Werte in der passenden Form sichern.
- ein „Rohling“ müsste mit dem Modul ausgeliefert werden
- aus dem Modul heraus muss auf die Daten zugegriffen werden
- die Daten sollten vom Nutzer des Moduls editierbar sein, ohne dass diese beim Modulupdate verändert werden
Mein Ansatz:
- Daten in einer csv-Datei als „Rohling“ im PHP-Modul
- bei der Initialisierung wird eine Kopie erstellt und der Dateiname z.B. mit der VariablenID des Moduls benannt
Wo müsste der Rohling hinkopiert werden um die Bedingungen bzw. die Konventionen zu erfüllen?
Gibt es andere Ideen für eine editierbare Matrix?
Joachim
Was hindert dich daran die Matrix als Script in IPS zu erzeugen, sobald die Instanz die Matrix nicht findet erzeugt sie aus ihren Modul-Ordner einfach eine neue.
Es muss ja noch nicht mal ein PHP-Script sein, die IPSLibrary zweckentfremdet ja auch ein ‚Script‘ und das ist eine .INI Datei.
Warum also nicht einfach umbenennen in .CSV und dort alles rein
Michael
…und wo müsste solch ein Datei dann zweckmäßig am Besten in der IPS-Struktur erstellt werden?
Joachim
Nachtrag: Ich glaube Du meinst die IPS_CreateScript-Funktion?
Ja genau die meine ich.
Dann auf Dateiebene umbenennen auf .csv und mit IPS_SetScriptFile IP-Symcon :: Automatisierungssoftware wieder zuordnen.
Und natürlich gehört die im Baum unterhalb der Instanz welche diese Daten benötigt und mit einem IPS_SetIdent damit du sie auch wiederfinden kannst.
Auf dem Dateisystem würde ich die einfach mit der ID der Instanz + .CSV benennen.
Du könntest sie dann sogar in IPS editieren, wohl nicht komfortabel weil der Editor das vielleicht doof anzeigt, aber es geht.
Michael
Hallo Michael,
der Möglichkeiten diese Werte abzulegen gibt es also viele. Vielen Dank für Deine Ideen!
Es muss ja auch nicht zwingend in Form einer csv-Datei sein. Denkbar wäre sicherlich auch, einfach die 3x96 Viertel-Stunden-Werte in einem Array abzulegen und damit tatsächlich ein „normales“ Skript zu nutzen.
Da es sich um den „Normalfahrplan“ der Raum-Soll-Temperatur handelt, wäre eine Editiermöglichkeit durch den Nutzer unumgänglich. Visualisieren könnte man das sicherlich auch irgendwie im Webfront durch eine HTML-Aufbereitung. Eigentlich wäre es dann oberstes Regal, wenn es einem gelingen würde diese Zeitreihe in Form einer Grafik (Zeit-Temperatur-Diagramm) darstellen zu können, in der man mit der Maus die einzelnen Werte verändern könnte…
Also: HTML-Profis, bitte melden!
Joachim
Nimm den Wochenplan
Brauchst ihn ja nicht als Ereignis an sich nutzen, sondern nur zur Visu und Objekt welches die Daten vorhält.
Mit den Nachrichten kannst du dich auch auf Änderungen des Wochenplans (also wenn er bearbeitet wurde) registrieren.
Michael
Hallo Michael,
und wieder eine neues Thema!
Nach erster Sichtung der Möglichkeiten scheint mir die Nutzung des Wochenplans ein guter Weg zu sein. Danke für den Tipp!
Offensichtlich gibt es aber keine Möglichkeit im Konfigurationsformular eine Farbe auszuwählen (so etwas wie „SelectColor“)?
Meine Umsetzungsidee sieht folgendermaßen aus:
Der Nutzer kann im Konfigurationsformular bis zu acht Temperaturen festlegen die er dann im Wochenplan für die einzelnen Tage/Stunden setzen kann. Jeder dieser acht Möglichkeiten kann man ja eine Farbe zuordnen. Diese kann man auch über die „normale“ Select-Funktion abbilden, schöne wäre hier jedoch, wenn man hier aus der Farbpalette wählen könnte. Oder bin ich da auf dem Holzweg?
Die weitere Umsetzung sieht vor, dass ich dann bei jeder Berechnung aus dem PHP-Modul abfrage, wie die gewünschte Soll-Temperatur aktuell im Wochenplan gesetzt ist…(IPS_GetEvent)?
oder
Jedes Event im Wochenplan setzt per Skript den aktuell gewünschten Soll-Wert im PHP-Modul…
Joachim
Wochenpläne können auch direkt Instanz-Funktionen ausführen.
Ich mache es anders, ich lese den Plan und schreibe die Zeiten in die Heizung.
Also läuft das Event ins Leere, weil ich es nicht benötige.
Farbwähler in der Konfiguration ist bestimmt ein schönes FeatureRequest
Michael
…Du bist aber wieder mal fix!
Lesen des Plans mit IPS_GetEvent?
Den Wunsch nach SelectColor formuliere ich dann noch mal bei den FeatureRequest…
Joachim
Ja mit GetEvent.
Der Aufbau ist auf den ersten Blick nicht ganz simpel, aber hier im Forum sind schon Scripte wie man z.B. den nächsten Schaltpunkt ausliest.
Michael
…zweifel gerade an einem Punkt:
Wenn ich ein Event mit dem Typ 2 erstelle wird ein Wochenplan erstellt. Aber wie sage ich es programmgesteuert, das ich sieben Tage (Gruppen) möchte?
Muss ich sieben mal IPS_SetEventScheduleGroup($EreignisID, 0, x); wobei x 1, 2, 4, 8 …64 enthält durchlaufen?
Oder geht das auch einfacher?
Joachim
Ja.
Hier ein Auszug von einer Methode mit welcher ich das EreignisID hole, bzw wenn nicht vorhanden das Ereignis anlege.
Meine Gruppen fangen aber bei 2 an, kannst es aber ändern.
private function GetSchedule()
{
//search for already available event with proper ident
$eid = @IPS_GetObjectIDByIdent("Schedule", $this->InstanceID);
//properly update eventid
if ($eid === false)
$eid = 0;
//we have a event with the proper ident. check if it fits
if ($eid > 0)
{
//check if we really have a event
if (!IPS_EventExists($eid))
throw new Exception("Ident with name Schedule is used for wrong object type"); //bail out
//check for type mismatch
if (IPS_GetEvent($eid)["EventType"] != 2)
{
//mismatch detected. delete this one. we will create a new below
IPS_DeleteEvent($eid);
//this will ensure, that a new one is created
$eid = 0;
}
}
//we need to create one
if ($eid == 0)
{
$eid = IPS_CreateEvent(2);
IPS_SetEventActive($eid, true);
//configure it
IPS_SetParent($eid, $this->InstanceID);
IPS_SetIdent($eid, "Schedule");
IPS_SetName($eid, "Zeitprogramm");
IPS_SetPosition($eid, 20);
IPS_SetEventScheduleGroup($eid, 2, 1);
IPS_SetEventScheduleGroup($eid, 3, 2);
IPS_SetEventScheduleGroup($eid, 4, 4);
IPS_SetEventScheduleGroup($eid, 5, 8);
IPS_SetEventScheduleGroup($eid, 6, 16);
IPS_SetEventScheduleGroup($eid, 7, 32);
IPS_SetEventScheduleGroup($eid, 8, 64);
IPS_SetEventScheduleAction($eid, 0, "Aktiv", 0x00ff00, "");
IPS_SetEventScheduleAction($eid, 1, "Inaktiv", 0x000020, "");
IPS_SetEventScheduleGroupPoint($eid, 2, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 3, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 4, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 5, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 6, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 7, 0, 0, 0, 0, 1);
IPS_SetEventScheduleGroupPoint($eid, 8, 0, 0, 0, 0, 1);
}
return $eid;
}
Michael
…so, zwischen den diversen Verwandtenbesuchen bin ich doch dazu gekommen etwas am Modul weiter zu arbeiten.
Das mit dem Wochenplan war ein toller Tipp, das Auslesen klappt auch so weit.
Jetzt geht es darum, die richtige Nachricht auszuwählen, um bei Änderungen das Modul sofort aktiv werden zu lassen.
Was ich brauche ist eingentlich nur EINE Nachricht, wenn irgendeine Änderung durchgeführt wurde. 10803 führt zu einen "Feuerwerk von Nachrichten, auch wenn nur eine kleine Änderung durchgeführt wurde, 10817 und 10823 führen auch nicht zum gewünschten Ergebnis…
Welche Nachricht würde nur ein MessageSink auslösen wenn sich irgendetwasder Schaltzeiten ändert?
Joachim
…oder: Wenn ich die Flut an Messages schon so nicht wegbekomme, wie bekomme ich es hin, dass die Flut von Meldungen nach irgendeiner Änderung im Wochenplan nur eine Aktion im MessageSink auslöst??
Joachim
…führe meinen Monolog mal weiter:
Selbst wenn ich den Wochenplan nur im Webfront öffne und ihn ohne irgendeine Änderung schließe gibt es eine Flut von 10821 und 10822 Meldungen!
Ist das so gewollt?
Joachim
Monolog? Ist ja mehr oder weniger ein Dialog zwischen Dir und Michael
Aber gut so, so kann man einiges daraus lernen, wenn man selber mal mit Modulen anfangen sollte und auf Fehler/Probleme stösst…
Monolog passt aktuell, da ich selber nicht dazu komme mich damit zu beschäftigen, kann ich schlecht antworten
Michael
…obwohl ich immer noch nach einer Lösung für das Nachrichten-Problem suche…
Ich habe nun ja alle meine Module in einer Library. Wenn ich an einem Modul etwas ändere werden offensichtlich alle Module mit dem ApplyChanges komplett durchlaufen, was dazu führt, das eine kleine Änderung das System m.E. unnütz lange beschäftigt (aktuell 17 Module in einer Library).
- Ist das wirklich sinnvoll oder erforderlich, dass alle Module nach dem Update „durchgestartet“ werden?
- Kann ich ggf. die Struktur im GitHub-Account - sinnvoll - so anpassen, dass separate Module auch nur einzeln eingelesen werden?
Joachim
Prinzipiell ist 10803 aber korrekt. Dort bekommst du entsprechend auch die nächste Ausführungszeit gesendet.
Zu den Module: Es muss das ganze Modul neu geladen werden. Woher soll IP-Symcon denn wissen, was sich im Detail geändert hat? Und da ein Modulupdate ja selten stattfindet, sehe ich das Problem nicht.
paresy