iCelsius WLAN-Thermometer

Begonnen von Icinger, 06 Januar 2016, 12:37:10

Vorheriges Thema - Nächstes Thema

herrmannj

na, daran hätten die Jungs schon denken müssen. Ich überleg mal lurz

Der iCelsius geht über udp broadcast ? Bekommst Du was im log ?

vg
joerg

Papaloewe

#16
ja, ist ein udp-broadcast. Sieht man im capture:
Zitat192.168.1.255

Hatte mich auch schon gefragt, woher sonst das iCelsius denn die IP vom fhem kennt?

herrmannj

auch gesehen. Und gleichzeitig überlegt ob ich das sehe :-D ... Dann war ich zu faul zum nachdenken und hab gedacht: wenns im log landet wirds wohl gehen. Deswegen die frage  :-) :-) :-)

Icinger

#18
Ich würde ja empfehlen, den String so zu splitten, wie ichs in meiner Sub mache:

  my @a = split("\\|",$string);
my @b=split("\\&",$a[1]);
my $x;
foreach $x (@b) {
  my @c=split("=",$x);
if(ReadingsVal($hash->{NAME},$c[0],undef) ne $c[1]) {
if ($c[0]=~/temp./) {readingsSingleUpdate($hash,$c[0],($c[1]-25000)/100,1)}
else
{readingsSingleUpdate($hash,$c[0],$c[1],1)};
};
};


Da es für das iCelsius auch andere Fühler gibt (Einstechfühler, Fühler mit nur einem Temp, einen Temp/Hum-Sensor) weiss ich nicht, welche Werte dann bei diesen anderen Sensoren gesendet werden.
Mit den beiden Spilt's wären wir universeller.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Papaloewe

#19
Ohne "\n" erscheint Folgendes im Log:
Zitat2016.01.08 21:07:44 4: BBQ: got that: SensorID=10002652&Mac=74:6a:89:00:46:b1&StoreForward=0&inFlash=0&Timestamp=3788567&RSSI=-85&battery=3932&sensorType=108&commMode=2&codeVersion=1.1.36&errorScanAp=0&SK=2448234605&ChargingStatus=0&temp1=27269&temp2=27157& from 192.168.yyy.xxx 34615

Und im Partial steht:
ZitatSensorID=10002652&Mac=74:6a:89:00:46:b1&StoreForward=0&inFlash=0&Timestamp=3788567&RSSI=-85&battery=3932&sensorType=108&commMode=2&codeVersion=1.1.36&errorScanAp=0&SK=2448234605&ChargingStatus=0&temp1=27269&temp2=27157&

Simuliert durch:
echo -n "SensorID=10002652&Mac=74:6a:89:00:46:b1&StoreForward=0&inFlash=0&Timestamp=3788567&RSSI=-85&battery=3932&sensorType=108&commMode=2&codeVersion=1.1.36&errorScanAp=0&SK=2448234605&ChargingStatus=0&temp1=27269&temp2=27157&" | nc -w 1 -u -4 192.168.yyy.xxx 54521

herrmannj

Zitat von: Icinger am 08 Januar 2016, 21:43:14
Ich würde ja empfehlen, den String so zu splitten, wie ichs in meiner Sub mache:

  my @a = split("\\|",$string);
my @b=split("\\&",$a[1]);
my $x;
foreach $x (@b) {
  my @c=split("=",$x);
if(ReadingsVal($hash->{NAME},$c[0],undef) ne $c[1]) {
if ($c[0]=~/temp./) {readingsSingleUpdate($hash,$c[0],($c[1]-25000)/100,1)}
else
{readingsSingleUpdate($hash,$c[0],$c[1],1)};
};
};


Da es für das iCelsius auch andere Fühler gibt (Einstechfühler, Fühler mit nur einem Temp, einen Temp/Hum-Sensor) weiss ich nicht, welche Werte dann bei diesen anderen Sensoren gesendet werden.
Mit den beiden Spilt's wären wir universeller.

lg, Stefan

Ja, das löst das aber nicht, weil:
Der receiver ist non-blocking. Kann also passieren das wir zuerst dieses Fragment
SensorID=10002652&Mac=74:6a:89:00:46:b1&StoreFo
und kurz darauf dieses
rward=0&inFlash=0&Timestamp=3788567&RSSI=-85&battery=3932&sensorType=108&commMode=2&codeVersion=1.1.36&errorScanAp=0&SK=2448234605&ChargingStatus=0&temp1=27269&temp2=27157&SensorID=10002
bekommen. Das Ist zusammen eine komplette msg plus der Anfang einer weiteren.

Deswegen landet das erst in PARTIAL. PARTIAL muss jetzt auf eine vollständige Nachricht geprüft werden, die muss dann "entnommen" werden und der Anfang der nächsten muss drin bleiben. Der nächste Aufruf von recv bringt den Rest der zweiten.

mit einem \n geht das effizient. Splitten, einer raus, einer drin.

man kann das jetzt auf verschiedene Arten lösen, gesucht ist aber die schnellste (oder die zweit schnellste ;-) )

vg
joerg

herrmannj

#21
mit dieser Version gibt sich der iCelsius für fhem als Oregon THR128 aus.

Den kennt fhem. Bei aktiviertem autocreate wird ein iCelsius jetzt automatisch als THR128 angelegt. Weil das THR nur eine Temperatur hat wird nur der erste Fühler angezeigt. Das geht auch mit mehreren iCelsius. Wenn sich ein neues iCelsius in Deinem Netz meldet legt autocreate ein neues THR dafür an, mit gplot definition und allem was dazugehört.

Wenn die neue rfxtrx firmware kommt müssen wir nur noch die codierung so anpassen das es sich als Grillthermometer meldet.

Die anderen Fühler von denen Du geschrieben hast könnte man später aufnehmen, aber erst wenn wir deren codes haben.Ist aber einfach.

Der code unterscheidet sich weil er das zwei Stufen Konzept nimmt. In Prinzip könnte man die zweite temp jetzt auf einen zweiten THR abbilden, muss aber für den Test nicht sein. So wie mit Deinem code kann man jetzt direkt losgrillen. Benötigt aber eben auch keine dummys oder so was sondern läuft jetzt wie jedes andere Thermometer in fhem als ganz normales device.

Dem modul fehlt das makeup

simulieren mit:
printf 'SensorID=10002652&Mac=74:6a:89:00:46:b1&StoreForward=0&inFlash=0&Timestamp=3788567&RSSI=-85&battery=3932&sensorType=108&commMode=2&codeVersion=1.1.36&errorScanAp=0&SK=2448234605&ChargingStatus=0&temp1=47153&temp2=27157&' > /dev/udp/localhost/5000


Icinger

Guten Morgen,

sieht beim ersten überfliegen ja mal nicht so schlecht aus.
Das ganze Drumherum (undef, set, get usw...) kann ich gerne in Ruhe dazumachen.
Nachdem das iCelsius ja scheinbar sonst eh noch keiner hat, is da kein druck dahinter **lach**

Bin gestern zu nix mehr gekommen, jetzt gehts auch gkleich wieder in die Firma.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Papaloewe

ZitatNachdem das iCelsius ja scheinbar sonst eh noch keiner hat, is da kein druck dahinter **lach**

Funktioniert soweit, aber nur für die Temp1.
Wenn ihr jetzt noch den zweiten Temperaturfühler einbaut, kaufe ich mir auch so ein Teil!

herrmannj

Zitat von: Papaloewe am 09 Januar 2016, 12:22:03
Funktioniert soweit, aber nur für die Temp1.
Wenn ihr jetzt noch den zweiten Temperaturfühler einbaut, kaufe ich mir auch so ein Teil!
am Ende wird alles gut. Immer ! :)

Das receiver modul konvertiert den iCelsius ja in einen Oregon und der kann eben nur eine Temp.
Wenn das bbq modul steht braucht man nur den converter minimal anzupassen um das iCelsius an das bbq Modul zu geben, das kann dann zwei temps.

Beim iCelsius (cooles Ding!) bin ich mir nicht sicher ab der Akku einen kompletten pp durchhält.

vg
joerg


Icinger

ZitatDer eingebaute 1000 mAh Li-Ionen Akku wird über einen USB Anschluss geladen. In Kombination mit einem Akkublock ergeben sich da Laufzeiten an der Nähe der Unendlichkeit :) Aber der eingebaute Akku hält auch so bis zu 50 Tage, wenn man das iCelsius so konfiguriert, das nur alle 5 Minuten eine Messung erfolgt. Die kürzeste Akkulaufzeit erreicht man übrigens bei permanenter Messung, dann ist nach knapp 10 Stunden der Akku aufgebraucht.

Sollte also schon eine zeitlang halten.

Meins läuft jetzt grade im Test im 5-Sekunden-Intervall seit heute früh ca. 6 Uhr, und die Akku-Led leuchtet immer noch nicht.

Sollte also für n PP durchaus passen.
Mal schaun, wie lang es wirklich noch durchhält.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

herrmannj

na das ist ja doch gut.

Mach Dir keinen Streß wg der Kosmetik. So läuft das mMn absolut ausreichend. Den rest können wir a machen wenn die bbq Anbindung da is - oder ?

vg
joerg

Icinger

#27
Streß mach ich mir damit eh keinen, dazu hab ich momentan auch zu wenig Zeit ^^
Je nach Lust und Laune mal vlt. kleine Änderungen oder so, aber das wars auch schon.

lg, Stefan

PS: Es läuft und läuft und läuft......24 Stunden schon......
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

Hmmmm, scheinbar lässt sich im laufenden Betrieb die Sampling-Rate nicht ändern.

Grundsätzlich läuft das so, dass das iCelsius erstmal im Direct-Mode ein eigenes WLAN aufbaut.
Dann kann man in der App den Sensor auswählen, das WLAN, mit dem sich das iCelsius dann verbinden soll, sowie die sampling-rate.

Danach wird von der App ein UDP-Telegram an den iCelsius gesendet:
639 77.132847 193.168.101.100 193.168.101.1 UDP 128 Source port: 50001  Destination port: 50001
0000   74 6a 89 00 46 b1 d0 22 be 53 0d b2 08 00 45 00  tj..F..".S....E.
0010   00 72 00 00 40 00 40 11 ec c4 c1 a8 65 64 c1 a8  .r..@.@.....ed..
0020   65 01 c3 51 c3 51 00 5e 88 0f 43 68 61 6e 67 65  e..Q.Q.^..Change
0030   53 53 49 44 3d 47 55 54 54 49 32 5f 45 58 54 26  SSID=GUTTI2_EXT&
0040   43 6f 6d 6d 4d 6f 64 65 3d 32 26 43 68 61 6e 67  CommMode=2&Chang
0050   65 53 61 6d 70 6c 69 6e 67 3d 31 35 26 43 68 61  eSampling=15&Cha
0060   6e 67 65 55 4c 50 3d 31 26 43 68 61 6e 67 65 53  ngeULP=1&ChangeS
0070   74 6f 72 65 41 6e 64 46 6f 72 77 61 72 64 3d 30  toreAndForward=0

Das iCelsius verbindet sich nun mit dem angegebenem WLAN und bleibt auch nach dem Ausschalten in diesem.
Der direct-mode kann aber jederzeit wieder aktiviert werden und ein anderes Netz ausgewählt werden, bzw. eben eine andere Sampling-Rate.

Versuche ich jetzt aber, im laufenden Betrieb solch ein Paket an das iCelsius zu senden, ändert sich leider nichts.

Dazu habe ich mir provisorisch eine Sub gemacht:
sub TestSender {
Log 3,"Start....";
my $sockxy = IO::Socket::INET->new(
    Proto    => 'udp',
    PeerPort => 50001,
    PeerAddr => '192.168.1.55',
) or die "Could not create socket: $!\n";
Log 3,"Opened....";

$sockxy->send('ChangeSSID=GUTTI2_EXT&CommMode=2&ChangeSampling=60&ChangeULP=1&ChangeStoreAndForward=0') or die "Send error: $!\n";
Log 3,"Sent....";

$sockxy->close();
Log 3,"Closed....";

}


Das Telegram wird zwar scheinbar gesendet, aber es kommt eben keine Reaktion vom Thermometer.
Schade, wäre ein nettes Gimmick gewesen.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

Mal ein kleines Zuckerl:

Auch zum Schnapsbrennen lässt sich das iCelsius gut verwenden :D
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho