Auf dem weg bekomm ich zwar kein Limit Fehler, aber das Bild ist nicht lesbar und auch im Debug sieht der $snapshot String dann im Device anders aus als im Gateway.
In der Symcon Doku habe ich noch Beispiele mit utf8_encode /utf8_decode gesehen, damit läufts dann wieder in den Limit Fehler…
Hab ich denn noch andere Möglichkeiten das Bild zu übergeben oder wäre es dann besser die ID des Medienobjekts zu übergeben und das schreiben direkt aus dem Gateway zu machen?
Eventuell ist irgendwo noch eine fehlende konvertierung?
IPS_SetMediaContent braucht ja wieder das base64…
Ich arbeite bei den Rückgabewerten gerne mit serialize und unserialize.
So kann ich auch ganze Arrays oder Objekte zurückgeben. Eventuell wäre das was für dich, wenn ich mir deinen Code bei ForwardData im Gateway anschaue.
Dann kannst du das wie folgt ändern und brauchst auch nirgendwo eine InstanzID im Datenaustausch.
case "getDevices":
$array = $this->getDevices($data->Param1);
//$this->send($data->InstanceID,$data->Api,json_encode($array));
//break;
return serialize($array);
Und z.B. im Device:
public function Send(string $api, string $param1)
{
if ($this->HasActiveParent()) {
$value = $this->SendDataToParent(json_encode(['DataID' => '{BBE44630-5AEE-27A0-7D2E-E1D2D776B83B}',
'Api' => $api,
/*'InstanceID' => $this->InstanceID,*/
'Param1' => $param1
]));
if ($value) {
return unserialize($value)
}
return false;
}
}
Das ist bestimmt für das JSON, welches auch die DataID benötigt (also für die Parameter bei den Funktionen und nicht bei dem Rückgabewert). Damit json_encode nicht über die Rohdaten stolpert.
Ne, das sieht ja vorher schon anders aus und das base64 hab ich dann im Device eingebaut. IPS_SetMediaContent($MedienID, base64_encode($snapshot));
Was das Gateway sendet (Snapshot:):
Was im Device ankommt (Send Data:):
Debug steht beides auf „Text“, sollte dann also gleich aussehen?
Ja, das muss ich ja noch komplett umbauen, da brauch ich ja auch die ID und Api nicht mehr zurückgeben, da ich ja den Kontext im Send habe, entsprechend dort ja dann passend reagieren kann…
So bitte nicht.
Dann lass das Gerät direkt das snapshot von der API laden.
Weil:
Eine Instanz darf nur unterhalb sich selbst und nie unter anderen Objekten Objekte erstellen oder ändern.
Siehe auch Punkt 5 und 6 hier bei review
Einfache Idee wäre:
Das Gerät sagt dem Parent: hey gibt mir mal die URL für meinen Snapshot und dann lädt das Gerät das Bild selber runter
Michael
Ich habe eine Liste im Konfigurationsformular, da soll zu jedem Eintrag eine Variable angelegt werden. Das anlegen ist auch nicht das problem, das bekomm ich im ApplyChanges hin:
Leider nein.
Aber… du kannst ja am Ende von Applychanges dir die neue/aktuelle Liste in einem Attribute speichern und dann hast du beim nächsten Applychanges die alte Liste (Attribut) und die neue (Property) zur Verfügung.
Michael