Associations zur Laufzeit erstellen

Hallo Leute,

in einem Modul habe ich folgende Funktion:

private function SetRadioStationsAssociations()
	{
		// Aktuelles Profil aufräumen
		$ProfilArray = Array();
		$ProfilArray = IPS_GetVariableProfile("IPS2Pioneer.RadioStations_".$this->InstanceID);
		foreach ($ProfilArray["Associations"] as $Association)
		{
			@IPS_SetVariableProfileAssociation("IPS2Pioneer.RadioStations_".$this->InstanceID, intval($Association["Value"]), "", "", -1);
		}
		
		$RadioStationsString = $this->ReadPropertyString("RadioStations");
		$RadioStations = json_decode($RadioStationsString);
		$this->SendDebug("SetRadioStationsAssociations", serialize($RadioStations), 0);
		
		foreach ($RadioStations as $Key => $Value) {
			$this->SendDebug("SetRadioStationsAssociations", $Value->RadioStationName." mit Frequenz ".round($Value->RadioStationFrequency, 1)." MHz hinzugefuegt", 0);
			IPS_SetVariableProfileAssociation("IPS2Pioneer.RadioStations_".$this->InstanceID, round($Value->RadioStationFrequency, 1), $Value->RadioStationName, "Melody", -1);
		}
		
	}

Im ersten Teil sollen die vorhandenen Associations gelöscht werden - das funktioniert offenbar.

Im zweiten Teil sollen die Daten einer List ausgelesen werden um sie als neue Associations hinzugefügt werden.

Im Debug hole ich mir dazu folgende Daten mal heraus:
im ersten „SendDebug“:

15.11.2020, 15:58:21 | SetRadioStationsAssociations | a:4:{i:0;O:8:"stdClass":2:{s:16:"RadioStationName";s:4:"R.SH";s:21:"RadioStationFrequency";d:102.5;}i:1;O:8:"stdClass":2:{s:16:"RadioStationName";s:8:"NDR1 Nds";s:21:"RadioStationFrequency";d:103.2;}i:2;O:8:"stdClass":2:{s:16:"RadioStationName";s:8:"Radio HH";s:21:"RadioStationFrequency";d:103.60000000000001;}i:3;O:8:"stdClass":2:{s:16:"RadioStationName";s:4:"NDR2";s:21:"RadioStationFrequency";d:87.60000000000001;}}

Es sind also zum Test vier Radiosender in der List (mal abgesehen von der Float-Darstellung das in einem anderen Thema bearbeitet wird) sind die Daten so identisch mit den Einträgen in der List.

Im zweiten „SendDebug“:

15.11.2020, 15:58:21 | SetRadioStationsAssociations | R.SH mit Frequenz 102,5 MHz hinzugefuegt

15.11.2020, 15:58:21 | SetRadioStationsAssociations | NDR1 Nds mit Frequenz 103,2 MHz hinzugefuegt

15.11.2020, 15:58:21 | SetRadioStationsAssociations | Radio HH mit Frequenz 103,6 MHz hinzugefuegt

15.11.2020, 15:58:21 | SetRadioStationsAssociations | NDR2 mit Frequenz 87,6 MHz hinzugefuegt

Das ist stimmig zu den Daten aus der List.

IPS_SetVariableProfileAssociation("IPS2Pioneer.RadioStations_".$this->InstanceID, round($Value->RadioStationFrequency, 1), $Value->RadioStationName, "Melody", -1);

sollte jetzt sein Wirkung entfalten.

ABER: Bei den Associations fehlt immer irgendeiner der Datensätze oder Frequenzen sind bei zwei Sendern identisch.

Habe ich ein Timing-Problem?

Joachim

Nein, du hast hier int benutzt bei den Values.
intval($Association[„Value“])
Und dann gibt das nicht zwei Sender mit float 103,xxMhz…sondern nur einen mit int 103.
Michael

Hallo Michael,

das was Du gefunden hast ist beim Löschen der aktuellen Assoziationen. Warum das war weiß ich nicht, hatte es aus einem anderen Skript kopiert. Habe ich jetzt geändert.
Das ist es aber nicht. Die Werte die hinzugefügt wurden waren auch als Float in der Variablen angekommen.

Aber ein wichtiger Impuls von Dir: der Wert der fehlt hat den gleichen Wert vor dem Komma!

Offenbar wird geschaut ob es schon ein „103“ gibt und nicht auf den Wert hinter dem Komma geachtet, obwohl er korrekt dargestellt wird wenn ich in die Variablen-Assoziationen schaue…

Ich habe das jetzt mal mit einem zweiten Radiosender mit „102“ probiert. Auch dort wird nur ein Sender von übernommen…

Möglicherweise ist das so nicht gedacht???

Was ich jetzt machen kann ist denn Wert mit 10 zu multiplizieren, bei der Ausführung denn Wert dann entsprechend wieder zu dividieren…

Joachim

Wenn das löschen falsch war, sind doch bestimmt alte Einträge übrig geblieben und würden dann mit neuen Daten überschreiben.

Wo hast du die Anzeige geprüft?
Im WebFront oder ProfilManager?
Hast du eventuell im Profil so etwas wie min/max oder Schrittweite eingestellt?
Das sollte alles nicht gesetzt sein bei einer festen Anzahl von Assoziationen.

Ich habe auch immer keine Lust auf float bei Assoziationen, da war es beim Onkyo Modul ganz praktisch dass das Protokoll nur mit integer arbeitet. Da wird dann einfach x 100 bzw. /100 gerechnet bei FM.
Michael

Ja, im Profilmanager wird korrekt auch der Nachkommawert angezeigt, nutzt man den Button im Webfront wird auch auf die richtige Frequenz geschaltet.
Im Profilmanager:
Schrittweite = 0
Min = 0
Max = 128

Joachim

Zeig doch mal die Konsole.
Vor dem nächsten Test würde ich das ganze Profil einmal löschen oder alle Assoziation.
Nicht das vorhin beim löschen noch alte Assoziationen vorhanden waren.

Btw: Das Modul ist für Pioneer Geräte welche nicht ISCP können? Und somit nicht mit dem Onkyo&Pioneer Modul laufen?
Michael

…ich glaube ich habe den Fehler gefunden - Variable war als Integer eingerichtet…:rolleyes:

Versuche das mal zu beheben…

Dann haben die Konsole und das WebFront ja alles richtig gemacht :smiley:
Michael

…manchmal fokussiert man sich eben auf etwas ganz bestimmtes und sieht die wahre Ursache erst einmal nicht, vielen Dank für den „Schupps“ in die richtige Richtung…

Joachim