[Modul] Sonoff

Der Fehler kommt immer und der IO flackert die ganze Zeit ein rotes Ausrufezeichen, ich denke mal die Ursache ist wohl der Umzug von IP-Symcon auf einen anderen Server. Mosquitto läuft aber immer noch auf dem alten Server. Eventuell sind es ja Firewall Einstellungen ich schaue mal ob ich fündig werde. Was muss ich denn in einer Firewall alles freigeben nur TCP/IP Port 1883 ein und ausgehend?

Wenn du der Meinung bist, dass es an der Firewall liegt, würde ich diese zum testen ein Mal komplett abschalten, aber nur zum testen.
Wenn du mit dem MQTT Client nicht auf dem testing bist, teste das bitte erst Mal.

Grüße,
Kai

Der Fehler sollte im development branch gefixt sein.

Habe auf die Testing gewechselt es macht aber keinen Unterschied. An der Firewall liegt es auch nicht es kommen auch Daten durch


SonoffSwitch | {"TOPIC":"tele\/sonoff\/LWT","MSG":"Offline","SENDER":"MQTT_GET_PAYLOAD"}

Allerdings geht das „Geblinke“ des Client Sockets (Öffne /Schließe) munter weiter und es gibt immer noch zu Hauf Fehlermeldungen. Keine Ahnung ob das eher auf IP-Symcon selber zurückzuführen ist bzw. wie man das vielleicht behebt.


PHP | Error: Error: Call to a member function receive() on null
   Error in Script D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on Line 247
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   33 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  121 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_PhpErrorHandler)
      in IPSLogger_PhpFatalErrorHandler


FlowHandler | Kann Daten nicht zur Instanz #11149 weiterleiten: 
Fatal error: Call to a member function receive() on null in D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on line 247
Abort Processing during Fatal-Error: Call to a member function receive() on null
   Error in Script D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on Line 247


Client Socket | Fehler beim Schreiben: Das angegebene Dateihandle ist ungültig

Sollte im IO Debug eigentlich etwas stehen, da finde ich nämlich nichts.

Hallo Fonzo,

ich schau mir das nochmal an.
Worauf läuft dein Symcon?

Edit: Ahhh sehe es, auf nem Windows.

Grüße,
Kai

@Fonzo teste mal den MQTT Client aus dem develop branch.

Grüße,
Kai

Ursächlich für die Fehlermeldung ist wohl das keine Daten rein kommen weil der Clientsocket gerade getrennt ist. Vielleicht kann man zumindest verhindern das die Fehlermeldung kommt wenn das sauber abgefangen wird. Ein ganz anderes Problem ist die Frage warum sich der Clientsocket ständig trennt und wieder aufbaut.

Passiert das bei dir nur, wenn du IPS neustartest?

Grüße,
Kai

Ist jetzt nach dem neusten Update weg und stabil. Ich werde das mal dauerhaft beobachten. Danke für den schnellen Bugfix :).

Bei der Funktion setStatus fehlt die Variablen Deklaration, so weis IP-Symcon nicht was gesetzt werden soll und es lässt sich nichts auswählen oder eintragen so lange Du nicht den Typ der Variable festlegst der übergeben wird.
funktion.png

Hallo Fonzo,

falsch. Ich aktualisiere heute Abend noch die Anleitung. Das ganze Modul habe ich umgestrickt.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

@Fonzo,
nutze nur NEU, in dem Modul, „IPS_Sonoff“.
„IPS_SonoffPow“ und „IPS_Switch“ ist „Altlast“ und fliegen raus.(Damit sollten die schon angelegten Module erst mal weiterlaufen…)
IPS_Sonoff kannst du für alle Sonoff Module nutzen ! Musst du dann aber neu anlegen…

Auf Testing habe ich umgestellt, ändert aber nichts an der Tatsache das ich die Funktion immer noch nicht in IP-Symcon nutzten kann da nach wie vor kein Type Hinting benutzt wird, daher kann ich da auch nichts eingeben, weil IP-Symcon gar nicht weis was es als Eingabe Feld entsprechend dem Variablentys anzeigen soll.
Ereigniss Sonoff.png

In Zeile 160 fehlt das type hinting bei der public function

wenn dort z.B.

public function setPower(string $Ident, string $Value)

stehen würde könnte ich dann auch in IP-Symcon was eingeben und die Funktion auch mit einem Ereignis nutzten.

Das korrigierte ist auch nur im dev branch zur Zeit.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Hallo zusammen,

im dev Branch gibt es eine neue Version.
SetPower wird nun mit der VariablenID und nicht mehr mit dem Ident aufgerufen.

Beispiel:

Sonoff_setPower(40389, 54025, 0);

In den kommenden Tagen werde ich den dev Branch in den master Branch mergen, dann sind die alten Module weg.
Also wer es nutzt bitte, darauf achten nur noch IPS-Sonoff zu nutzen.

Grüße,
Kai

Warum ist es denn notwendig die Variablen ID mitzugeben?

Pro Gerät gibt es ja nur maximal eine Variable die An/Aus schaltet, kann man daher nicht einfach eine Ident wie Sonoff_Power vergeben? Falls Du irgendwie sonst noch was an Infos ablegen willst würde ich die in eine Property oder ins Beschreibungsfeld ablegen und nicht in die Ident verpacken.

Du scheinst ja $powerTopic zu brauchen, variiert das denn immer? Wenn ja kannst Du das ja in einer Property ablegen oder im Beschreibungsfeld.

Dann reicht es ja auch vollkommen aus wenn dann lediglich die Instanz und true/false aufgerufen wird.


$this->RegisterVariableBoolean("Sonoff_Power", "Status","~Switch");


public function setPower(bool $Value)
{
	if ($Value)
	{
		SetValue($this->GetIDForIdent("Sonoff_Power"), $Value);
	}
	else
	{
		SetValue($this->GetIDForIdent("Sonoff_Power"), $Value);
	}
	
	$powerTopic = $power[key($power)]; // Wenn Variabel dann aus Property oder Beschreibungsfeld auslesen
  
  $FullTopic = explode("/",$this->ReadPropertyString("FullTopic"));
  $PrefixIndex = array_search("%prefix%",$FullTopic);
  $TopicIndex = array_search("%topic%",$FullTopic);
  $SetCommandArr = $FullTopic;
  $index = count($SetCommandArr);
  $SetCommandArr[$PrefixIndex] = "cmnd";
  $SetCommandArr[$TopicIndex] = $this->ReadPropertyString("Topic");
  $SetCommandArr[$index] = $powerTopic;
  $topic = implode("/",$SetCommandArr);
	
	if($Value)
	{
		$msg = ReadPropertyString("On");
	}
	else
	{
		$msg = ReadPropertyString("Off");
	}
	$Buffer["Topic"] = $topic;
	$Buffer["MSG"] = $msg;
	$BufferJSON = json_encode($Buffer);
	//MQTT_Publish(33877 /*[MQTT Client]*/, $topic,$msg,0,0);
	$this->SendDebug("setStatus", $BufferJSON,0);
	$this->SendDataToParent(json_encode(Array("DataID" => "{018EF6B5-AB94-40C6-AA53-46943E824ACF}", "Action" => "Publish", "Buffer" => $BufferJSON)));
}

Hallo Fonzo,

nein, es gibt mehrere Variablen, die geschaltet werden können. Ich habe hier zum Beispiel 4 Power Variablen, die zu einem Sonoff Gerät gehören.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Wenn ich IP-Symcon neu starte ist leider immer noch das „flackern“ vom IO da und die Fehlermeldung


PHP | Error: Error: Call to a member function receive() on null
   Error in Script D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on Line 247
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   33 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  121 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_PhpErrorHandler)
      in IPSLogger_PhpFatalErrorHandler


FlowHandler | Kann Daten nicht zur Instanz #11149 weiterleiten: 
Fatal error: Call to a member function receive() on null in D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on line 247
Abort Processing during Fatal-Error: Call to a member function receive() on null
   Error in Script D:\IP-Symcon\modules\IPS-KS-MQTT\MQTT_client\module.php on Line 247

Ok aber kannst Du deshalb nicht trotzdem über die Ident die Variable ansteuern wie Sonoff_Power_1 , Sonoff_Power_2 usw. ?

Kannst ja 4 Funktion machen eine Hauptfunktion, und wenn jemand 4 Power hat dann gibt es eben SetPower1(bool $Value), SetPower2(bool $Value) usw. dann weis man welchen Kanal man schaltet und Du weist welche Ident Du auslesen musst.

Klar geht das, so war es ja vorher auch.
Ist ja auch eigentlich egal ob per ID oder Ident, oder warum willst du unbedingt per Ident schalten?

Das mit dem Fehler, muss ich mir nochmal anschauen.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk