Module überschreiben Skripte beim IPS Start mit initialen Inhalten

Hallo,

ich habe in meinem Cortana Modul für ips4Windows die Codeverarbeitung so gebaut, dass der User selber Dinge erweitern kann. Seit dem letzten „stable“ Update (hatte vorher die Version von Mai 2016, jetzt 2. August 2016) werden bei jedem IPS Neustart auf dem PI aber die Skripte der Module mit den initialen Inhalten überschrieben.

Soll das so sein, wenn ja wie realisiere ich dann Anpassungen an den Modulen? Ich hätte erwartet, dies passiert beim neuen einlesen oder aktualisieren von Modulen von GitHub, aber nicht bei beim Neustart.

Grüße
Seb.

Gar nicht?
Weil der User soll den Code ja nicht ändern.
Dafür gibt es ja normale Scripte…

Oder meinst du etwas anderes, als das Script aus den das Moduls besteht.
Michael

ja das macht Sinn bei Modulen die nur immer die selben Operationen ausführen. Aber wenn ich in einem Modul Konfigurationen des „IPS Besitzers“ berücksichtigen will macht es keinen Sinn. Bis zum letzten Update war das kein Problem und stand auch so in den Beispielen „Your Code goes here…“.

Nur jetzt scheint das vorbei und ich müsste mir erst einen Weg überlegen wie ich eine spezifische Konfiguration welche vermutlich in einem Skript liegt pro User „merken“ kann.

Grüße
Seb.

Keine Ahnung was du genau vorhast, Aber üblicherweise verpackt man alle Daten in die $_IPS-Variable und startet ein Script welches der User in der Instanz eintragen muss.
Michael

Mag „neu“ so sein, das will ich ja nur verstehen! Aber in der Vergangenheit knapp 6 Monate her war in den Beispielen und der nicht vorhandenen Doku von paresy ein Modul, welches bei der Installation ein Skript angelegt hat.

In diesem gab es dann einen Bereich wo man als User selber Änderungen gemacht hat, weil beim Neustart des Dienst das Modul eben nicht neu alle Skripte geladen hat. Aktuell scheint das anders zu sein, ich will jetzt verstehen ob das „by design“ ist und ich mir was anderes überlegen muss.

Mein Skript vom Modul sieht wie folgt aus:

<? //Do not delete or modify.
include(IPS_GetKernelDirEx()."scripts/__ipsmodule.inc.php");
include("../modules/ips4Windows/ips4WinCortana/module.php");
$ips4WinCortana = new ips4WinCortana(34291 /*[ips4WinCortana]*/);
$ips4WinCortana->ProcessHookData();
if ($_POST['ips4Command'] != "GetConfig")
{
//Your code goes here...

$resultArray = $ips4WinCortana->GetCortanaResult();
//$resultArray has all the data from Cortana
//textSpoken - full message captured by Cortana
//CommandName - Command of textSpoken line, user defined in ips4CortanaSprachbefehle script (aka section)
//action - used entry from PhraseList defined in ips4CortanaSprachbefehle script
//room - used entry from PhraseList defined in ips4CortanaSprachbefehle script
//feedback - if you used SendFeedbackVerify or SendFeedbackVerifyDetailed you will get the result from this commands, multiple iteration will be added with "#+#" as seperator. Use explode ( "#+#" , $resultArray->feedback) to work with the result array
IPS_LogMessage("WebHook Cortana", print_r($resultArray, true));
//do something useful
//...
//Cortana waits for feedback, otherwise the request will timeout in seconds and shows an error
//Options: sucess - SendFeedbackSuccess(Msg), failure - SendFeedbackFailure(Msg)
//verify with yes/no - SendFeedbackVerify(Msg), verify with more option - SendFeedbackVerifyDetailed(Msg, ListofOptions as array)

/*
31.01.2016 18:40:49*| WebHook Cortana*| Array
(
    [ips4Command] => Data
    [commandMode] => voice
    [actor] => Licht
    [room] => Wohnzimmer
    [NavigationTarget] => ips4WindowsVoiceCommandService
    [status] => 50
    [action] => ändere
    [CommandName] => Block1
    [textSpoken] => ändere das Licht Wohnzimmer auf 50 Prozent
)*/
	$bError = true;
	if (isset($resultArray['CommandName']))
		$bError = false;

	if (!$bError)
	{

	}
	else
	{
	 	$result = $ips4WinCortana->SendFeedbackFailure("Mh, Es kam nicht alles am Server an was ich erwartet hätte - 'CommandName' Fehler");
	}

	if ($resultArray['CommandName'] == "TempFragen")
	{
	   if (isset($resultArray['room']))
	   {
	      $bError = false;
		   if ($resultArray['room'] == "Wohnzimmer")
		   {
		      $val1 = GetValueFloat(23074 /*[Räume\Wohnzimmer\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(46507 /*[Räume\Wohnzimmer\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else if ($resultArray['room'] == "Garten")
		   {
		      $val1 = GetValueFloat(58965 /*[Räume\Flur Keller\Wetterstation\WMRS200 Temperatur- und Feuchtigkeitssensor (Außen)\Temperatur]*/);
		      $val2 = GetValueInteger(44450 /*[Räume\Flur Keller\Wetterstation\WMRS200 Temperatur- und Feuchtigkeitssensor (Außen)\Luftfeuchtigkeit]*/);
			}
			else if ($resultArray['room'] == "Schlafzimmer")
		   {
		      $val1 = GetValueFloat(57495 /*[Räume\Schlafzimmer\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(44407 /*[Räume\Schlafzimmer\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else if ($resultArray['room'] == "Kinderzimmer")
		   {
		      $val1 = GetValueFloat(45901 /*[Räume\Kinderzimmer\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(22517 /*[Räume\Kinderzimmer\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else if ($resultArray['room'] == "Bad")
		   {
		      $val1 = GetValueFloat(23534 /*[Räume\Bad\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(56878 /*[Räume\Bad\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else if ($resultArray['room'] == "Heizungskeller")
		   {
		      $val1 = GetValueFloat(23534 /*[Räume\Bad\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(56878 /*[Räume\Bad\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else if ($resultArray['room'] == "Büro")
		   {
		      $val1 = GetValueFloat(31649 /*[Räume\Büro\Heizung\Wandthermostat\2\ACTUAL_TEMPERATURE]*/);
		      $val2 = GetValueFloat(59881 /*[Räume\Büro\Heizung\Wandthermostat\2\ACTUAL_HUMIDITY]*/);
			}
			else
			{
			   $bError = true;
			}

			if($bError == false)
				$result = $ips4WinCortana->SendFeedbackSuccess("Es sind ".$val1." ° Celsius im ".$resultArray['room']." und ".$val2." % Luftfeuchtigkeit");
			else
				$result = $ips4WinCortana->SendFeedbackFailure("Mmmh Fehler, für ".$resultArray['room']." habe ich noch keine Konfiguartion am Server");
		}
		else
			$result = $ips4WinCortana->SendFeedbackFailure("Mmmmh Fehler, bitte sprich deutlicher ich habe keinen Raum verstanden!");

	}
.......

Bisher war das der Weg laut Doku und Beispielen, aber der geht jetzt nicht mehr. Ich habe aber gerade in den Beispielen auf github gesehen das paresy die ebenfalls geändert hat.

Schön wäre mal eine verlässliche Aussage, vermutlich können sich alle auch anders beschäftigen als Skripte umzuschreiben :slight_smile:

Grüße
Seb.

Du hast in der Tat recht, dass sich an der Stelle etwas geändert hat. Und das aus dem Grund, dass die automatisch generierten Skripte und Ereignisse den vordefinierten Inhalt haben sollen. Wenn du das Modul aktualisierst, soll auch der Inhalt der generierten Skript und Ereignisse aktualisiert werden. Das war somit ein Fehler den wir korrigiert haben. Du hast doofer Weise auf das falsche Pferd gesetzt.

Wie Nall Chan schon erklärt ist für deinen Use-Base ein „SelectScript“ im Formular korrekt, in dem der User selber ein Zielskript definieren kann. Dort kannst du dann in der Doku auch gerne in gutes Beispiel zum Copy&Paste hinzufügen, aber primär ist wichtig, welche Variablen du mitlieferst. Dann kann jeder selber ein passendes Skript erstellen.

Du würdest also CreateScript weiterhin nutzen, aber du um den benötigten „Dispatcher“ für den WebHook zu erstellen. Dort passiert nicht viel mehr als ein IPS_RunScript mit den entsprechenden Variablen auf das Zielskript vom Benutzer.

paresy

Also geht es ja doch nicht um den eigentlichen Code des Moduls, sondern um ein Script was vom Modul angelegt wird um den Hook zu verarbeiten.
Ist dann sogar eher noch eine Unzulänglichkeit des SDK, das der Hook nicht direkt von der Instanz verarbeitet werden kann.
Michael

Genau. Die RegisterScript API ist nur ein Hilfsmittel, um genau dieses Problem zu lösen. (Bzw. alle anderen, wo ein festes, nicht editierbares Skript als Wrapper gebraucht wird)

paresy

Warum es den Usern einfach machen und ein Skript vom Modul erstellen lassen, wenn man die User auch wieder manuell mit Copy&Paste beschäftigen kann. Besonders die einfache Installation/Einrichtung war das was den IPS-Einsteigern so gut an den Modulen gefallen hat. Sind nur ein paar Variablen im extra Skript, dann ist das kein Problem, aber es gibt auch Fälle mit kompletten Funktionen die der User sich anpassen oder erweitern kann, da ist es dann sehr bescheiden. Ich sehe absolut keinen vernünftigen Sinn in diesem „neuen Feature“…

Wenn man als Modul-Ersteller vom Modul generierte Skripte updaten will, dann kann man das selbst über sein Modul machen und der User kann entscheiden, ob er das will oder für sinnvoll hält oder nicht.

Und wozu Zeit in neue Module investieren, wenn man seine alten Module auf neue „IPS-Ideen“ anpassen kann…

Das UniFi-Modul, welches du (paresy) ebenfalls verwendest, hast du damit auch „gekillt“. Aber nicht schlimm (für mich), ich schreibe sowieso an einem eigenen UniFi-Modul. Schade nur für die anderen User.

-Chris-

Du musst ja nicht RegisterScript nutzen… Kannst auch komplett selbst ein Script mit deinem Modul erzeugen…
Ich glaube meine Script-Vorlagen (Design für Html-Box) welche meine Instanzen erzeugen, sind nicht betroffen.
Da ich RegisterScript nur aufrufe wenn das Script nicht existiert :slight_smile:
Michael

Für mich selbst ist es kein Problem, ein Workaround mehr oder weniger den man bei der Modul-Erstellung beachten muss…darauf kommt es nun wirklich nicht mehr an :rolleyes:

Ich verwende „RegisterScript“ eh nur an einer Stelle und da ist es egal. Den Rest hab ich zum Glück schon „richtig“ gemacht und da ist nichts vom neuen Feature „betroffen“. Aber ich denke da, wie immer, hauptsächlich an die anderen User…

Grüße,
Chris

Auf jeden Fall muss ein Hinweis in die Doku, bei der Funktion, falls noch nicht geschehen. Und falls das „Feature“ bleibt…

-Chris-

Hi Chris,

ich habe schon ein Ticket für die Doku erstellt. Somit ist die nächsten Tage da der passende Hinweis drin!
Inkl. Tipp, wie die von uns gedachte Lösung aussehen soll.

paresy