1-Wire Controller 1 Ethernet

Hallo,
ich bin gerade bei der Inbetriebnahme meines neuen 1-Wire Controller von eservice-online.
Bisher konnte ich diesen erfolgreich über UDP an IPS anbinden.
Auch eine RegisterVariable habe ich angelegt.
Jetzt wollte ich einen Befehl an den Controller senden um einen Wert abzufragen:

Es ist doch richtig, dass ich über die RegisterVariable die Anfrage an den Controller sende, oder?
Wie man im Debug der regVar sehen kann, geht die Anfrage auch raus aber warum bekomme ich keine Antwort?

Hiho,

hab den Controller auch, welche Geräte hast du denn dranhängen. Im Normalfall brauchste keine Werte einzeln abzufragen da diese
sowieso per UDP reinkommen alle 15 Sek ca. musst eigentlich nur der RegVariable ein Script verpassen das die Daten auswertet und in Variablen schreibt.

Hier mal Screenie von meiner Konstellation ( hab 2 S0 Counter dran )

Script write_values :
( Muss als Zielscript in der Registervariable sein, String Variable „Empfangen“ )

$data = $_IPS['VALUE'];
SetValue(37854, $data);

Script write_data :
Mit Trigger auf Variablenaktualisierung ( Kann grad Text nicht Kopieren deshalb Picture )

Hallo Flobo,

Danke für die Beispiele!
Genau das habe ich gesucht.
Mir war nicht klar wie ich die Valiablen aus dem Register befüllen kann.
Das mit dem senden brauche ich, da ich im Controller die Artikelnummern der Geräte hinterlegen möchte.
Außerdem habe ich auch 1-Wire Relais die ich ansteuern möchte.
Was mir auch noch nicht klar ist, warum hast du zwischen der Registervariablen und dem Skript noch eine normale Variable eingebaut?

Ich habe derzeit nur einen DC-HUB zum Testen angeschlossen.
Es sollen später ca. 20 Geräte eingebunden sein.

Jens

Ich glaube der Controller findet die Geräte von selber oder nicht ?
Wie es mit Schalten von 1-Wire Komponenten aussieht habe ich noch nicht rausgefunden :slight_smile: sollte aber gehen bzw. der Andreas von Eservice hat erwähnt das es noch nicht vorhanden ist aber kommen soll.

Die Variable hab ich deswegen das mir die UDP Daten als String da ankommen und ich dann mit dem Aktualisierungstrigger die Werte aufdröseln kann wie ich es brauche. Zudem hats den vorteil das wenn mal die Ethernet Verbindung abreissen sollte keine Toten Threads Produziert werden.

Ah!
Wieder etwas dazu gelernt!

Ich habe jetzt noch etwas getestet, dabei ist mir aufgefallen, dass der Contoller nach einem Spannungsausfall die Namen der Geräte neu vergibt.
Bei mir in anderer Reihenfolge.
Jetzt kann ich die Werte nicht mehr zuordnen…
Ist das bei dir auch so?
Das kann ja nicht gewollt sein???
( Speichen nicht vergessen, dann wird die Reihenfolge nicht verändert)
Was ich aber schon mal sagen kann:
Die Geräte werden bei mir zu 100% erkannt und vom Controller ausgegeben.
Das gibt mir schon mal ein sehr gutes Gefühl.

Ich berichte einfach mal weiter…

Da ich es nicht geschafft habe dem Controller auf Anfrage eine Antwort zu entlocken,
und ich daher auch die Version nicht auslesen kann, dachte ich mir ein Firmwareupdate kann nicht schaden.
Also runterladen, entpacken und in das Updatetool öffnen.
So einfach ist es nicht!
Das Tool erwartet eine .bin, der Download ist aber .bas.
(Die richtige Firmware liegt zum Download bereit, das Problem ist somit erledigt! DANKE)

Anbei noch ein Bild dass ihr auch seht um was es geht:

Hallo,

ein paar Informationen zum 1-Wire Controller.

Der Controller erwartet auf jeden Befehl ein CR.

Ausgänge setzen:
Mit der neuen Firmware ist es jetzt möglich digitale Ausgänge für DS2405, DS2408 und DS2413 zu setzen bzw. zu schalten.
Dafür gibt es zwei Befehle:

  1. Alle Ausgänge per HEX Wert zu beschreiben (z.B. für LCD Anzeigen) oder
  2. Einen einzelnen Ausgang on/off schalten. Alle bereits geschalteten Ausgänge werden nicht verändert.
    Die Befehle sind für alle drei Bausteine gleich, man muß nur beachten, dass man die Ausgabe an den Baustein anpasst. Klar, ein DS2413 (Dual I/O) kann z.B. keinen Ausgang 6 setzen, da nur 0 oder 1 möglich ist. Sollte der Wert nicht passend sein, gibt der Controller eine Fehlermeldung zurück.

Eingänge DS2405, DS2408 oder DS2413 lesen:
Zyklisch werden auch die digital Eingänge der Bausteine gelesen und ausgegeben.
Zusätzlich gibt der Controller bei Wechsel eines Eingangswerts per Event den geänderten Eingang einzeln aus. Man weiß damit sofort an welchem Baustein sich ein Eingang High oder Low geworden ist. Durch die hohe Pollzeit des 1-Wire Bus, gibt der Controller eine Eingangsänderung nach max. 1-2 Sekunden Verzögerung aus.

E-Service Module:
Man kann für ein 1-Wire Baustein die E-Service Artikelnummer setzen und bekommt dann die entsprechenden Werte fertig berechnet zurück. Beispiel: Temperatur-Feuchte Modul 11102 eingeben und man bekommt Temperatur, Luftfeuchte und Taupunkt anstatt der Standard DS2438 Werte ausgegeben.
Einen Baustein zurücksetzen kann man indem man den Baustein löscht und den automatischen Scan abwartet. Der baustein kommt dann wieder auf den gleichen Platz, da dieser ja frei geworden ist.

Bauteilnummerierung:
Bei einem Power Up wird der Bus nach 1-Wire Bausteinen gescannt. Werden im Betrieb neue Bausteine angeschlossen, werden diese automatisch erkannt und als letztes Bauteil in die Reiehenfolge aufgenommen. So bleibt die Reihenfolge von bestehenden Bausteinen gleich. Es gibt nur eine Ausnahme, wenn ein Baustein gelöscht wurde. Ein neuer Baustein wird dann an diese freie Stelle geschrieben. Die Logic dahinter ist, er speichert den neuen Baustein an der ersten freien Stelle in ein Array. Wenn ein Baustein gelöscht wurde, ist das die erste freie Stelle.

Bauteilreihenfolge speichern:
Die Bauteilreihenfolge sollte am vor einem Power Off im Controller gespeichert werden, damit bei einem neustart diese Reihenfolge wieder geladen wird. Ansonsten beginnt der Controller wie bei einer Erstinbetriebnahme.

Firmware:
Es gibt seit heute eine neue Firmware (V0.90) und Befehlsliste.

Das waren ein paar Informationen, gern kann ich mehr geben.

Grüße
Andreas

Hallo andrge,

Besten Dank für die Ausführung.
Ich habe die neue Firmware 0.90 erfolgreich aufgespielt.
Hat ohne Probleme funktioniert!

Die neue Funktion mit den einzelnen Ports setzen konnte ich leider noch nicht testen, da ich die Hardware derzeit nicht angeschlossen habe.
Kommt am Wochenende.

Konnte auch mit „get,sys,version\r“ die Version abfragen.
Nach dem Setzen der Artikelnummern für den DC-Hub (bei mir OWD1) fehlt mir die Variable OWD1_4.
Die Werte 1 bis 3 sehen auch komisch aus.

Weitere Test folgen.

Danke für den tollen Support!
Grüße Jens

Jens,

Kann ich nicht nachvollziehen. Sollte gehen. Versuch doch testweise die Art.Nr. 11300.
Was bedeutet „komisch“?? Lachen die Werte oder haben sie einen Hut auf?? :smiley:

Poste doch ein Beispiel.

Grüße
Andreas

Hallo Andreas,

Ja, die Werte lachen :smiley:

Der HUB ist OWD1:

EDIT:
Habe die Artikel-NR auf 11300 geändert.
Jetzt scheinen die Werte zu passen, Danke!

11300.PNG

Die einzelnen Ports an meinem 2408 lassen sich mit dem Befahl „SET,OWD,OUT,3,4,1\r“ bestens ansteuern.
Diese Funktion ist für mich sehr hilfreich da ich mir eine menge Rechnerei in IPS ersparen kann!

Auch das Setzen der Ports mit „SET,OWD,OUTH,3,0\r“ funktioniert ohne Probleme.
(eigentlich könnte der Befahl auch OUTD benannt werden, da ich ja einen Dezimalwert übergebe)

Jens

Hallo Andreas,
der Controller macht mir inzwischen sehr viel Freude. Allerdings hardere ich noch mit der Zuordnung der Bausteine. Auch wenn nach dem Speichern die Reihenfolge gleich bleibt, so gibt es immer noch ein Restrisiko, dass ich nach einem Stromausfall eine falsche Belegung bekomme.
Was hältst Du davon, die Statusmeldungen von
1_OWD1_1|Sensorwert
auf
1_Seriennummer_1|Sensorwert
umzustellen. Die Ansteuerung der Bausteine müsste dann über
SET,OWD,OUTH,Seriennummer,Sollwert
geschehen. Dann braucht man sich keine Gedanken mehr über die Zuordnung oder die Reihenfolge machen, oder liege ich da falsch? Mir würde das die IPS-Programmierung deutlich vereinfachen.

Viele Grüße
Silberstreifen

Moin Flobo,

würdest Du dein Skript hier posten? Würde mir ne menge abtipperei von deinem Screenshot ersparen! :slight_smile:
Danke…

Peter

Hey Peter,
vielleicht hilft Dir das auch weiter. Habe das wie folgt gelöst…


//		1-Wire-Schnittstelle
//    von Silberstreifen
//    V2.1 vom 21.12.2014
//    Anpassung auf Firmware 1.00
//________________________________________________________________


//----------------------------------------------------------------
//		Variablen festlegen
//----------------------------------------------------------------

	$Parent = IPS_GetParent($_IPS['SELF']);
   if (!@IPS_GetObjectIDByName("Ersatz", $Parent)){
		$variableid = IPS_CreateVariable(3);
		IPS_SetName($variableid, "Ersatz");
		IPS_SetParent($variableid, $Parent);
	}
	$Ersatz_ID = IPS_GetObjectIDByName("Ersatz", $Parent);

//----------------------------------------------------------------
//		Auswertung
//----------------------------------------------------------------

	$daten = explode (";", $_IPS['VALUE']);
	$Adress = explode ("|", $daten[0])[0];

//----------------------------------------------------------------
//		Neue Zuordnung erstellen
//----------------------------------------------------------------

	if ($Adress == "1_READY"){
		IPS_Sleep(2000);
   	RegVar_SendText($Parent, "SET,SYS,DATA,0\r");
		IPS_Sleep(2000);
   	RegVar_SendText($Parent, "GET,OWB,LIST0\r");
		return;
	}

//----------------------------------------------------------------
//		Neue Zuordnung erstellen
//----------------------------------------------------------------

	if ($Adress == "1_LST0"){
	//----------------------------------------------------------------
	//		Auswertung
	//----------------------------------------------------------------

		$Ergebnis = explode ("1_EVT", $_IPS['VALUE']);
		$Ergebnis = explode ("1_", $Ergebnis[0]);
	   while (list ($key, $val) = each ($Ergebnis) ){
	      $data = explode ("|", $val);
		   if(substr($data[0],0,3)=="OWD"){
				$Adresse = "1_".$data[0];
				$ID = $data[1];
				$find[] = $Adresse;
				$replace[] = $ID;
			}
		}

	//----------------------------------------------------------------
	//		Speichern
	//----------------------------------------------------------------

		$find = implode (",", $find);
		$replace = implode (",", $replace);
		SetValueString($Ersatz_ID, "$find;$replace");
		return;
	}

//----------------------------------------------------------------
//		Zuordnung holen
//----------------------------------------------------------------

	$Ersatz = explode (";", GetValueString($Ersatz_ID));
	$find = explode (",",$Ersatz[0]);
	$repl = explode (",",$Ersatz[1]);


//----------------------------------------------------------------
//		Werte den IDs zuordnen
//----------------------------------------------------------------

   while (list ($key, $data) = each ($daten) ){
		$Ergebnis = explode ("|", $data);
		if (count($Ergebnis) >1){
			$Adress = $Ergebnis[0];
			$Result = $Ergebnis[1];

		//----------------------------------------------------------------
		//		Ergebnis fehlerhaft
		//----------------------------------------------------------------

		   if ($Result == "22222"){
		   	RegVar_SendText($Parent, "SET,SYS,RST,1\r");
				return;
			}

			switch (substr($Adress, 0, 5)) {
				case "1_OWD":

		//----------------------------------------------------------------
		//		Adresse nicht bekannt
		//----------------------------------------------------------------

				   if ($Adress == str_replace ($find, $repl, $Adress)){
				   	RegVar_SendText($Parent, "SET,SYS,RST,1\r");
						return;
					}
					$Adress = str_replace ($find, $repl, $Adress);
			   case "1_EVT":
				   if (!@IPS_GetObjectIDByName($Adress, $Parent)){
						$variableid = IPS_CreateVariable(3);
						IPS_SetName($variableid, $Adress);
						IPS_SetParent($variableid, $Parent);
					}

		//----------------------------------------------------------------
		//		Werte schreiben
		//----------------------------------------------------------------

					SetValueString(IPS_GetObjectIDByName($Adress, $Parent), $Result);
					break;
				default:
				   break;
			}
		}
	}


Das Script dann von der Registervariablen mit dem UDP-Socket als übergeordneter Instanz aufrufen lassen. Jetzt musst Du nur noch den Controller einmal vom Strom abziehen und wieder anstecken. Damit wird die Initialisierung ausgeführt.

Viel Spass damit
Silberstreifen

[21.12.14, 17:16] Script überarbeitet. Änderungen im 1-wire-Netz werden jetzt erkannt.
[24.13.14, 13:46] Script an Firmware V1.00 angepasst.

Moin Silberstreifen,
vielen Dank für dein Skript. Das werde ich sehr gerne ausprobieren. Noch habe ich bei Schwiegereltern ( den habe ich nur eine Professional Lizenz gekauft ) genau Variablen übrig.

Danke und Grüße,
Peter

musste das Script nochmal anpassen (siehe oben). War nicht auf die aktuelle Firmware angepasst. In Firmware V1.00 lauten die Befehle etwas anders als be V0.98, die ich noch drauf hatte.

Grüße
Silberstreifen

Cool… Vielen Dank!! Werde es morgen testen.
Fröhliche Weihnachten,
Peter

Hallo Silberstreifen

kann es sein das Du das aktualisierte Script noch nicht ins Forum gestellt hast?
Bei mir kommt auf Zeile 80 eine Fehlermeldung.

Die Version in #13 sieht stark nach der angepassten Version aus.

In der kommt der Fehler.
Hatte ich eingepflegt.
Datum ist irreführend 21.12?

Hallo Wibo,

welcher Fehler kommt bei Dir? Hast Du eventuell nicht das gesamte Script übertragen? Zeile 80 ist bei mir eine Kommentarzeile und kann damit keinen Fehler haben.

Grüße
Silberstreifen