Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Protokoll für WS7000-20 #136

Closed
HomeAutoUser opened this issue Feb 21, 2017 · 71 comments
Closed

Protokoll für WS7000-20 #136

HomeAutoUser opened this issue Feb 21, 2017 · 71 comments

Comments

@HomeAutoUser
Copy link
Contributor

Hallo,
Inputs für den WS7000-20

MU;P0=32001;P1=-438;P2=781;P3=288;P4=-922;D=01212121212121212121342121342134343434213434342121343434212134213421213421212121342121212134213421213421212134343421212134212121343434343421343421342134343434213;CP=3;R=112
MU;P0=32001;P1=-444;P2=778;P3=297;P4=-928;D=01212121212121212121342121342134343434213434342121343434212134213421213421212121342121212134213421213421212134343421212134212121343434343421343421342134343434213;CP=3;R=112
MU;P0=11656;P1=-458;P2=765;P3=279;P4=-937;D=01212121212121212121342121342134343434213421213421343434212134213421213421212121342121212134213421213421212134343421212134212121343434212134342121343434342121213;CP=3;R=113
MU;P0=20680;P1=-460;P2=758;P3=271;P4=-951;D=01212121212121212121342121342134343434213421212134343421342134213421213421212121342121212134213421213421212134343421212134212121343434343434342121212134342121213;CP=3;R=72
MU;P0=6144;P1=-457;P2=766;P3=273;P4=-941;D=01212121212121212121342121342134343434213434212134342121212134213421213434212134342121213434343421213421343421343421212134212121343421213434343421213434343421213;CP=3;R=74

Protokollinfo
Erklärung

Wie würde dann die Definitionen
one => [],
zero => [],
....
lauten?

sidey79 added a commit that referenced this issue Feb 22, 2017
Demodululierung für WS7000-20 #136 und Übergabe an CUL_WS Modul eingebaut
@sidey79
Copy link
Contributor

sidey79 commented Feb 22, 2017

Ich habe die Demudulierung eingebaut. Allerings ist zu Beginn nur 9x das 0 Bit im Signal. In Summe sind 79 Bits vorhanden. So wie ich das Protokoll verstanden habe, sollten aber 81 Bits vorhanden sein. Das Erste fehlt und vermutlich auch das letzte.

@HomeAutoUser
Copy link
Contributor Author

  1. Ich habe deine Änderungen übernommen via Update.
    Es passiert noch nichts, keine Erkennung bisher.
    Jeweils die richtige Zeile welche aber dann nicht sichtbar weiterverarbeitet wird.

  2. Dazu fällt mir auf, das ich nach einem Programmstart erst immer den Empfänger Bsp. mit ccconf anfragen muss, bevor sich überhaupt am kompletten Empfang sich etwas ergibt. | Am Code oder der Initialisierung etwas geändert? Der Empfänger ist aber jedoch auf Status: opened.

@sidey79
Copy link
Contributor

sidey79 commented Feb 22, 2017

Die Werte für zero und one habe ich aus dem Link Protokollinfo... Clockabs habe ich halt mal auf 200 angenommen... in etwa passt das ja auch.

Wenn der sduino auf opened steht, dann sollte er auch funktionieren.
Warum nichts erkannt wird, verstehe ich nicht. Was passiert denn im Log?

@HomeAutoUser
Copy link
Contributor Author

Vorgehensweise:

  • Stop FHEM via Konsole
  • Start FHEM via Konsole
  • Empfänger als opened im Status
  • nix passiert (bekomme ich schnell mit, da bei der Anzahl der Sensoren Minütlich was passiert)
  • ccconf Anfrage, sofort rennt er los

Logfile:

2017.02.22 23:11:29 0: Server shutdown
2017.02.22 23:11:29 5: sduino_radino SW: XQ
2017.02.22 23:11:36 1: Including fhem.cfg
2017.02.22 23:11:36 3: WEB: port 8083 opened
2017.02.22 23:11:36 3: WEBphone: port 8084 opened
2017.02.22 23:11:36 3: WEBtablet: port 8085 opened
2017.02.22 23:11:36 2: eventTypes: loaded 787 events from ./log/eventTypes.txt
2017.02.22 23:11:36 3: Opening CUL_868Mhz device /dev/serial/by-id/usb-busware.de_CUL868-if00
2017.02.22 23:11:36 3: Can't open /dev/serial/by-id/usb-busware.de_CUL868-if00: Datei oder Verzeichnis nicht gefunden
2017.02.22 23:11:36 3: sduino_radino: IDlist MS 0 1 13 14 15 17 2 22 23 25 3 32 33 35 38 4 41 45 51 55 6 7
2017.02.22 23:11:36 3: sduino_radino: IDlist MU 13.1 16 20 21 24 26 27 28 29 30 31 34 36 37 39 40 42 44 44.1 46 48 49 5 50 56 59 60 8 9
2017.02.22 23:11:36 3: sduino_radino: IDlist MC 10 11 12 18 43 47 52 57 58
2017.02.22 23:11:36 3: Opening sduino_radino device /dev/serial/by-id/usb-Unknown_radino_CC1101-if00
2017.02.22 23:11:36 3: Setting sduino_radino serial parameters to 57600,8,N,1
2017.02.22 23:11:36 1: sduino_radino/define: /dev/serial/by-id/usb-Unknown_radino_CC1101-if00@57600
2017.02.22 23:11:36 1: sduino_radino/init: /dev/serial/by-id/usb-Unknown_radino_CC1101-if00@57600
2017.02.22 23:11:36 3: sduino_radino device opened
2017.02.22 23:11:36 3: sduino_radino: setting Verbose to: 5
2017.02.22 23:11:36 3: sduino_nano: IDlist MS 0 1 13 14 15 17 2 22 23 25 3 32 33 35 38 4 41 45 51 55 6 7
2017.02.22 23:11:36 3: sduino_nano: IDlist MU 13.1 16 20 21 24 26 27 28 29 30 31 34 36 37 39 40 42 44 44.1 46 48 49 5 50 56 59 60 8 9
2017.02.22 23:11:36 3: sduino_nano: IDlist MC 10 11 12 18 43 47 52 57 58
2017.02.22 23:11:36 3: Opening sduino_nano device /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
2017.02.22 23:11:36 3: Can't open /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0: Datei oder Verzeichnis nicht gefunden
2017.02.22 23:11:36 3: sduino_nano: setting Verbose to: 4
2017.02.22 23:11:37 1: Including ./log/fhem.save
2017.02.22 23:11:38 1: usb create starting
2017.02.22 23:11:38 3: Probing CUL device /dev/ttyAMA0
2017.02.22 23:11:38 3: Probing TCM_ESP3 device /dev/ttyAMA0
2017.02.22 23:11:38 3: Probing FRM device /dev/ttyAMA0
2017.02.22 23:11:43 1: usb create end
2017.02.22 23:11:43 0: Featurelevel: 5.8
2017.02.22 23:11:43 0: Server started with 117 defined entities (fhem.pl:13447/2017-02-19 perl:5.020002 os:linux user:fhem pid:5842)
2017.02.22 23:15:00 5: sduino_radino: command for gets: C0DnF
2017.02.22 23:15:00 3: sduino_radino/init: disable receiver (XQ)
2017.02.22 23:15:00 5: sduino_radino SW: XQ
2017.02.22 23:15:00 3: telnetForBlockingFn_1487801700: port 43097 opened
2017.02.22 23:15:00 3: sduino_radino/init: get version, retry = 0
2017.02.22 23:15:00 5: sduino_radino SW: V
2017.02.22 23:15:00 5: sduino_radino SW: C0DnF
2017.02.22 23:15:00 4: sduino_radino/msg READ: V 3.3.1-dev SIGNALduino cc1101 (433Mhz )- compiled at Feb 22 2017 18:06:42
2017.02.22 23:15:00 5: sduino_radino/msg READ: regexp=V\s.SIGNAL(duino|ESP). cmd=version msg=V 3.3.1-dev SIGNALduino cc1101 (433Mhz )- compiled at Feb 22 2017 18:06:42
2017.02.22 23:15:00 2: sduino_radino: initialized. v3.3.1-dev
2017.02.22 23:15:00 5: sduino_radino SW: XE
2017.02.22 23:15:00 3: sduino_radino/init: enable receiver (XE)
2017.02.22 23:15:00 4: sduino_radino/msg READ: C0Dn11=10B07157C43023B900070018146C070091
2017.02.22 23:15:00 4: sduino_radino/HandleWriteQueue: nothing to send, stopping timer
2017.02.22 23:15:09 4: sduino_radino/msg READ: bufferMove -> 5 bufferMove -> 11 bufferMove -> 5 bufferMove -> 11 bufferMove -> 9 bufferMove -> 4 bufferMove -> 9 bufferMove -> 9 bufferMove -> 2 bufferMove -> 9 bufferMove -> 9 check:mcrst:�MU;P0=962;P1=-992;P2=-513;P3=469;D=010102323132023231023101320102323101320101320231320232313232323232023232323101323232320231323201010101323201320132323202323102323132;CP=3;R=12;�
2017.02.22 23:15:09 4: sduino_radino/msg READ: check:mcrst:mlen:129:mstart: 0
2017.02.22 23:15:09 4: sduino_radino/msg READ: pulseShift:1;L1l0L1l0L1s0S_s0S_l0S1s_L1s0S_s0S_l0L1s0S_l0L1l0S1s_L1l0L1s0S_s0S_l0L1l0S1s_L1l0L1l0S1s_S1s_L1l0S1s_L1s0S_s0S_l0S1s_S1s_S1s_S1s_S1s_L1s0S_s0S_s0S_s0S_l0L1l0S1s_S1s_S1s_S1s_L1s0S_l0S1s_S1s_L1l0L1l0L1l0L1l0S1s_S1s_L1l0S1s_L1l0L1l0S1s_L1l0L1s0S_l0S1s_L1l0S1s_:mpos=129:mstart=1:mend=129:vcnt=89:bfin:
2017.02.22 23:15:09 4: sduino_radino/msg READ: �MC;LL=-991;LH=944;SL=-524;SH=462;D=A8C4B45AEC7E0BE755DAD34;C=486;L=90;R=15;�
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 10 clock 486 RSSI -66.5 -> OSV2o3
2017.02.22 23:15:09 5: sduino_radino: extracted data 01010111001110110100101110100101000100111000000111110100000110001010101000100101001011001011 (bin)
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 12 clock 486 RSSI -107.25 -> Hideki protocol
2017.02.22 23:15:09 5: sduino_radino: extracted data 01010111001110110100101110100101000100111000000111110100000110001010101000100101001011001011 (bin)
2017.02.22 23:15:09 4: sduino_radino: hideki protocol converted to hex: 75B7BA8A0EBE3055524D01 with 91 bits, messagestart 1
2017.02.22 23:15:09 5: sduino_radino: converted Data to (P12#75B7BA8A0EBE3055524D01)
2017.02.22 23:15:09 5: sduino_radino: dispatch P12#75B7BA8A0EBE3055524D01
2017.02.22 23:15:09 4: Hideki_Parse sduino_radino incomming P12#75B7BA8A0EBE3055524D01
2017.02.22 23:15:09 4: Hideki_Parse SensorTyp = 30 decodedString = 75d9ce9e12c250fff6d703
2017.02.22 23:15:09 4: sduino_radino decoded Hideki protocol model=Hideki_30, sensor id=d9, channel=5, bat=ok, temp=21.2, humidity=50
2017.02.22 23:15:09 5: deviceCode: Hideki_30_5
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 52 clock 486 RSSI -127.625 -> OS_PIR
2017.02.22 23:15:09 5: sduino_radino: extracted data 01010111001110110100101110100101000100111000000111110100000110001010101000100101001011001011 (bin)
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 58 clock 486 RSSI -137.8125 -> tfa 30.3208.0
2017.02.22 23:15:09 5: sduino_radino: extracted data 01010111001110110100101110100101000100111000000111110100000110001010101000100101001011001011 (bin)
2017.02.22 23:15:09 4: sduino_radino/msg READ: MC;P1=944;P2=-991;P3=-524;P4=462;D=0121213434243134342134212431213434212431212434312431343424343434343134343434212434343431342434312121212434312431212431213424312431;CP=4;�
2017.02.22 23:15:09 4: sduino_radino/msg READ: check:mcrst:mlen:46:mstart: 0
2017.02.22 23:15:09 4: sduino_radino/msg READ: pulseShift:1;L1l0L1l0L1s0S_s0S_l0S1s_L1s0S_s0S_l0L1s0S_l0L1l0S1s_L1l0L1s0S_s0S_l0L1l0S1s_L1l0L1l0S1s_L1:mpos=46:mstart=1:mend=46:vcnt=33:bfin:
2017.02.22 23:15:09 4: sduino_radino/msg READ: �MC;LL=-1007;LH=938;SL=-522;SH=461;D=A8C4B45AC;C=487;L=34;R=14;�
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 52 clock 487 RSSI -67 -> OS_PIR
2017.02.22 23:15:09 5: sduino_radino: extracted data 010101110011101101001011101001010011 (bin)
2017.02.22 23:15:09 4: sduino_radino/msg READ: MC;P1=938;P2=-1007;P3=-522;P4=461;D=01212134342431343421342124312134342124312124313;CP=4;�
2017.02.22 23:15:09 4: sduino_radino/msg READ: check:mcrst:mlen:69:mstart: 0
2017.02.22 23:15:09 4: sduino_radino/msg READ: pulseShift:6;S1s_S1s_S1s_L1s0S_s0S_s0S_s0S_l0L1l0S1s_S1s_S1s_S1s_L1s0S_l0S1s_S1s_L1l0L1l0L1l0L1l0S1s_S1s_L1l0S1s_L1l0S1s_L1l0L1s0S_l0L1s0S_l0L1l0S1s_H(vcnt:47:mpos=68:mstart=0:mend:68:found::pidx=96 bufferMove -> 68
2017.02.22 23:15:09 4: sduino_radino/msg READ: �MC;LL=-1003;LH=952;SL=-508;SH=462;D=F05F3AAEDA4A;C=487;L=47;R=14;�
2017.02.22 23:15:09 4: sduino_radino: Found manchester Protocol id 52 clock 487 RSSI -67 -> OS_PIR
2017.02.22 23:15:09 5: sduino_radino: extracted data 000011111010000011000101010100010010010110110101 (bin)
2017.02.22 23:15:09 4: sduino_radino/msg READ: MC;P0=462;P1=-508;P2=952;P3=-1003;D=41;CP=0;�
2017.02.22 23:15:13 4: sduino_radino/msg READ: bufferMove -> 9 bufferMove -> 9 bufferMove -> 9 bufferMove -> 8 bufferMove -> 9 check:mcrst:�MU;P0=-935;P1=526;P2=-1928;P3=-248;D=01010101010121010101010101010101212121010121212121210101013;CP=1;R=213;�
2017.02.22 23:15:14 4: sduino_radino/msg READ: bufferMove -> 8 bufferMove -> 11 check:mcrst:�MU;P0=-112;P1=556;P2=-1920;P3=-908;P4=-352;D=01213131313131313121313131313131313131214;CP=1;R=215;�
2017.02.22 23:15:15 4: sduino_radino/msg READ: bufferMove -> 9 bufferMove -> 2 bufferMove -> 7 bufferMove -> 7 bufferMove -> 9 bufferMove -> 2 check:mcrst:mlen:127:mstart: 0
2017.02.22 23:15:15 4: sduino_radino/msg READ: preamble:9Cl0L1l0L1s0S_s0S_l0S1s_L1l0S1s_L1l0L1s0S_s0S_l0S1s_L1l0L1s0S_s0S_l0L1l0S1s_L1l0L1l0S1s_L1s0S_l0L1s0S_l0S1s_L1s0S_l0S1s_S1s_S1s_S1s_S1s_S1s_S1s_S1s_L1l0S1s_S1s_L1s0S_s0S_l0S1s_S1s_L1l0L1l0L1s0S_l0L1l0L1l0L1l0S1s_L1l0S1s_L1s0S_l0S1s_S1s_L1l0L1l0L1l0S1s_:mpos=127:mstart=0:mend=127:vcnt=88:bfin:
2017.02.22 23:15:15 4: sduino_radino/msg READ: �MC;LL=-1014;LH=938;SL=-525;SH=455;D=51B468B5933FEE3A956CEA8;C=488;L=89;R=244;�
2017.02.22 23:15:15 4: sduino_radino: Found manchester Protocol id 10 clock 488 RSSI -80 -> OSV2o3
2017.02.22 23:15:15 5: sduino_radino: extracted data 10101110010010111001011101001010011011001100000000010001110001010110101010010011000101010111 (bin)
2017.02.22 23:15:15 4: sduino_radino: Found manchester Protocol id 12 clock 488 RSSI -114 -> Hideki protocol
2017.02.22 23:15:15 5: sduino_radino: extracted data 10101110010010111001011101001010011011001100000000010001110001010110101010010011000101010111 (bin)
2017.02.22 23:15:15 4: sduino_radino: hideki protocol converted to hex: 75E9BACA33408EADC95403 with 92 bits, messagestart 0
2017.02.22 23:15:15 5: sduino_radino: converted Data to (P12#75E9BACA33408EADC95403)
2017.02.22 23:15:15 5: sduino_radino: dispatch P12#75E9BACA33408EADC95403
2017.02.22 23:15:15 4: Hideki_Parse sduino_radino incomming P12#75E9BACA33408EADC95403
2017.02.22 23:15:15 4: Hideki_Parse SensorTyp = 30 decodedString = 753bce5e55c092f75bfc05
2017.02.22 23:15:15 4: sduino_radino decoded Hideki protocol model=Hideki_30, sensor id=3b, channel=1, bat=ok, temp=5.5, humidity=92
2017.02.22 23:15:15 5: deviceCode: Hideki_30_1
2017.02.22 23:15:15 4: sduino_radino: Found manchester Protocol id 52 clock 488 RSSI -131 -> OS_PIR
2017.02.22 23:15:15 5: sduino_radino: extracted data 10101110010010111001011101001010011011001100000000010001110001010110101010010011000101010111 (bin)
2017.02.22 23:15:15 4: sduino_radino: Found manchester Protocol id 58 clock 488 RSSI -139.5 -> tfa 30.3208.0
2017.02.22 23:15:15 5: sduino_radino: extracted data 10101110010010111001011101001010011011001100000000010001110001010110101010010011000101010111 (bin)
2017.02.22 23:15:15 4: sduino_radino/msg READ: MC;P1=938;P2=-1014;P3=-525;P4=455;D=01212134342431243121343424312134342124312124313421342431342434343434343434312434313434243431212134212121243124313424343121212434;CP=4;�
2017.02.22 23:15:15 4: sduino_radino/msg READ: check:mcrst:mlen:105:mstart: 0
2017.02.22 23:15:15 4: sduino_radino/msg READ: s_L1l0L1s0S_s0S_l0L1l0S1s_L1l0L1l0S1s_S1s_L1l0L1s0S_l0S1s_L1s0S_l0S1s_S1s_S1s_S1s_S1s_S1s_S1s_S1s_L1l0S1s_S1s_L1s0S_s0S_l0S1s_S1s_L1l0L1l0L1s0S_l0L1l0L1l0L1l0S1s_L1l0S1s_S1s_L1l0S1s_L1s0S_s0S_l0L1s0S_l0S1s_H(vcnt:71:mpos=103:mstart=0:mend:103:found::pidx=96 bufferMove -> 103

PS: Die aktuelle Source wird verwendet.

@sidey79
Copy link
Contributor

sidey79 commented Feb 22, 2017

Da sind ein paar Debug Meldungen enthalten... So funktioniert der kram nicht an FHEM.

Nimm besser mal das Firmware File, welches ich für den Radino compiliert habe.

@HomeAutoUser
Copy link
Contributor Author

Nimm besser mal das Firmware File, welches ich für den Radino compiliert habe.

Ich hatte das von der Vorversion genommen, welches auf dem Rechner liegt und bis zum Update von FHEM funktionierte. Kein Erfolg.

Dein File, ich finde dies auf Anhieb nicht und unter den FIRMWARE - FHEM Verzeichnis ist dies nicht vorhanden.

@sidey79
Copy link
Contributor

sidey79 commented Feb 22, 2017

Stimmt wohl, ich hatte nach dem 5.Februar keine mehr erstellt..naja dann compiliere diese Version:

RFD-FHEM/SIGNALDuino@92374bf

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 22, 2017

Hier "rennt" er erstmal wieder.
Da schau ich dann mal weiter zwecks dem Protokoll.

EDIT: Er findet zumindest schon mal Sensoren und legt diese an. Werte bleiben bisher noch aus.

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 23, 2017

Hallo,
die Devices werden angelegt nach der Anpassung von Dir. Werte bleiben jedoch noch aus.
Grund dafür wird sein, die Übergabe an CUL_WS müssen angepasst werden.
Die Zeichenkette, welche wir erhalten muss "zurecht gebogen" werden, indem man jede 5. 1 (CHK) herausfiltert ... usw.

Zeichenkette K..... welche für CUL_WS unverständlich ist

2017.02.23 16:30:09 4: sduino_radino: decoded matched MU Protocol id 60 dmsg K0025EB6292972DEF6ADC length 80 RSSI = -54
2017.02.23 16:30:09 5: sduino_radino: converted Data to (K0025EB6292972DEF6ADC)
2017.02.23 16:30:09 5: sduino_radino: dispatch K0025EB6292972DEF6ADC
2017.02.23 16:30:09 1: CUL_WS Cannot decode K0025EB6292972DEF6ADC


Vorschlag von mir, wäre eine Sub erstellen

sub SIGNALduino_WS7000()
{
"Veränderungen Zeichenkette durchführen"
}

und die Rückgabe an CUL_WS, das die Daten verständlich sind.

Dazu noch eine Anpassung vornehmen Bsp:

"60" => ## WS7000 #############################################################################
# MU;P0=3472;P1=-449;P2=773;P3=280;P4=-941;D=01212121212121212121342121342134343434213434212134342121212134213421213421343421342121212134212134213421343421342121213434343434213421212134343434213434342134343;CP=3;R=52;
{
name => 'WS7000',
id => '60',
one => [2,-4],
zero => [4,-2],
clockabs => 200,
preamble => 'K', # prepend to converted message
postamble => '', # Append to converted message
clientmodule => 'CUL_WS',
#length_min => '78',
#length_max => '80',
method => &SIGNALduino_WS7000, # <--------- ?????????????
},
);

Meine Frage wäre, wo wäre es am passendsten diese Sub einzubinden (00_SIGNALduino.pm am Ende bei sämtlichen Sub´s ) und wie erhalte ich die Werte darin? Das war mir noch nicht gelungen obwohl ich mit shift probierte bzw. my ($name,$bitData,$id) = @_; ...
Die Dreherei würde ich hinbekommen denke ich, nur ohne die "Grunddaten" kann ich schlecht beginnen die Zeichenkette für CUL_WS anzupassen das Werte herauskommen, welche Stimmen.

MfG

@sidey79
Copy link
Contributor

sidey79 commented Feb 23, 2017

Also, das ist mir in der culfw so nicht aufgefallen, dass die 1er Check Bits dort entfernt werden.

Den Parameter Method gibt es bei den MU Nachrichten nicht. Die Demodulierung klappt in der Regel ohne Funktion.

Trotzdem kein Problem, wenn wir die Daten filtern müssen, dann geht das mit dem Parameter filterfunc .

Das ist aber vermutlich doch zu umständlich.
Ich hatte einmal vor, auch nach der Verarbeitung noch eine Funktion optional durchlaufen zu können. Bin nicht sicher, ob ich es eingebaut habe :)

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 23, 2017

filterfunc

Ich werde mal schauen ob ich es umgesetzt bekomme. Bisher hapert es daran, das ich die Übergabe in die Sub noch nicht erfolgreich umgesetzt bekam. Das "zurecht drehen" ist dann noch ein "Kinderspiel".

... 1er Check Bits dort entfernt werden

Die dortigen Daten sind in etwa so

"For KS300:
KFFTTTHWHWWRRFR
Data must be read backwards
For S300TH:
KaaTTHTHH
Data must be read backwards "
aber da kommt dann noch der Luftdruck hinzu.

Unsere Zeichenkette K0025EB6292972DEF6ADC ist dann für das Modul etwas zu "lang"

@sidey79
Copy link
Contributor

sidey79 commented Feb 23, 2017

filterfunc passt nicht... dafür ist es nicht gedacht.

es Fehlt noch eine predispatch oder sowas Option. Ich kann mich heute nicht mehr drum kümmern, baue es aber gerne ein. @Ralf9 was meinst Du sollen wir in dispatch generell eine Möglichkeit der Manipulation einbauen oder sollen wir das in parse_MU / parse_MC / parse_MS jeweils separat einbauen?

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 23, 2017

Dann auf jedenfall über diese Funktion nachdenken bzw. den presdispatch.
Im Grunde wurde schon einmal das selbige gemacht im Abschnitt

"12" => ## hideki
{
name => 'Hideki protocol',
.... folgend und der dazugehörigen Sub

Dort werden Daten dann ebenso angepasst.
Da dort auch ein Weg der method gewählt wurde schlussfolgerte ich auf diesen Weg, oder sehe ich das verkehrt, das dort dies so gemacht wurde?

@sidey79
Copy link
Contributor

sidey79 commented Feb 23, 2017

method ist ausschließlich für Manchester Nachrichten, da wir diese immer irgendwie analysieren müssen. Der Arduino übergibt da bereits hexadezimale Werte.

@Ralf9
Copy link
Contributor

Ralf9 commented Feb 24, 2017

@Ralf9 was meinst Du sollen wir in dispatch generell eine Möglichkeit der Manipulation einbauen

Ich denke dies ist nicht notwendig.
Bei MU Nachrichten gibt es eine "postDemodulation", evtl kann dies verwendet werden.

@sidey79
Copy link
Contributor

sidey79 commented Feb 24, 2017

Postdemodulation war genau das was ich in Erinnerung hatte @Ralf9

Irgendwie habe ich das gestern nicht gefunden :(

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 24, 2017

Postdemodulation

Ist ein Weg, welcher soeben genutzt wird ;-)
Ergebnis folgt nach Vollendung.

Kleiner Zwischenschritt als Ansicht

2017.02.24 21:08:52 1: DEBUG>sduino: demodulated message raw (0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1), 79 bits
2017.02.24 21:08:52 1: DEBUG>sduino: ########## Beginn SIGNALduino_postDemo_WS7000 ##########
2017.02.24 21:08:52 1: DEBUG>sduino: bit_msg vor Bearbeitung: 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1
2017.02.24 21:08:52 1: DEBUG>sduino: Startbit 1 at pos: 9
2017.02.24 21:08:52 1: DEBUG>sduino: bit_msg nach Bearbeitung: 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1
2017.02.24 21:08:52 1: DEBUG>sduino: ########### Ende SIGNALduino_postDemo_WS7000 ###########
2017.02.24 21:08:52 4: sduino: decoded matched MU Protocol id 60 dmsg K74090237 length 32 RSSI = -45.5
2017.02.24 21:08:52 4: sduino: Speicherung Wert 60 dmsg HASH(0x211b5b0)
2017.02.24 21:08:52 1: DEBUG>sduino: dispatching now msg: K74090237
2017.02.24 21:08:52 1: CUL_WS Cannot decode K74090237

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 24, 2017

Daumenhoch

Du kannst gern folgenden Code einarbeiten. Ich habe diesen laufen und die Werte kommen direkt über das CUL_WS Modul im FHEM an.

sub SIGNALduino_postDemo_WS7000()
{
	#$name,@bit_msg
	my @bit_msg = @_;
	my $name = "sduino";
	my $debug = AttrVal($name,"debug",0);
	my $index = 0;
	my @new_bit_msg;

    Debug "$name: ########## Beginn SIGNALduino_postDemo_WS7000 ##########" if ($debug);
    Debug "$name: bit_msg vor Bearbeitung:  @bit_msg" if ($debug);
	# Start bei erstem Bit mit Wert 1 suchen
	until (@bit_msg[$index] == 1) {
	$index++;
	}
    Debug "$name: Startbit @bit_msg[$index] at pos: $index" if ($debug);
	##### Fehlerprüfung einbauen #####
	$index++;															# first bit of data
	@new_bit_msg[0 .. 3] = reverse @bit_msg[$index+5 .. $index+8];		# [1] Sensoradresse
	@new_bit_msg[4 .. 7] = reverse @bit_msg[$index .. $index+3];		# [2] Sensortyp
	@new_bit_msg[8 .. 11] = reverse @bit_msg[$index+15 .. $index+18];	# [3] Temperatur 1
	@new_bit_msg[12 .. 15] = reverse @bit_msg[$index+10 .. $index+13];	# [4] Temperatur 0,1
	@new_bit_msg[16 .. 19] = reverse @bit_msg[$index+25 .. $index+28];	# [5] Humidity 0,1
	@new_bit_msg[20 .. 23] = reverse @bit_msg[$index+20 .. $index+23];	# [6] Temperatur 10
	@new_bit_msg[24 .. 27] = reverse @bit_msg[$index+35 .. $index+38];	# [7] Humidity 10
	@new_bit_msg[28 .. 31] = reverse @bit_msg[$index+30 .. $index+33];	# [8] Humidity 1
	@new_bit_msg[32 .. 35] = reverse @bit_msg[$index+45 .. $index+48];	# [9] Pressure 10
	@new_bit_msg[36 .. 39] = reverse @bit_msg[$index+40 .. $index+43];	# [10] Pressure 1
	@new_bit_msg[40 .. 43] = reverse @bit_msg[$index+55 .. $index+58];	# [12] Checksum
	@new_bit_msg[44 .. 47] = reverse @bit_msg[$index+50 .. $index+53];	# [11] Pressure 100

    Debug "$name: bit_msg nach Bearbeitung: @new_bit_msg" if ($debug);
    Debug "$name: ########### Ende SIGNALduino_postDemo_WS7000 ########### \n" if ($debug);
	return (@new_bit_msg);
}

	"60" => ##  WS7000 ## ggf. baugleiche
	{
		name   		 		=> 'WS7000',   
		id					=> '60',
		one             	=> [2,-4],            
		zero        		=> [4,-2],          
		clockabs     		=> 200,                
		preamble      		=> 'K',                	# prepend to converted message
		postamble     		=> '',                  # Append to converted message       
		clientmodule  		=> 'CUL_WS',
		length_min      	=> '44',
		length_max      	=> '80',
		postDemodulation	=> \&SIGNALduino_postDemo_WS7000,	# call the decode an mod-bit Sub
	}, 

@elektron-bbs
Copy link
Contributor

Hallo,
etwas voreilig gepostet, bitte noch nicht einbauen da die Fehlerprüfung noch fehlt. Es werden zufällig Sensoren angelegt, wenn mal ein Bit falsch kommt oder fehlt.
MfG

@sidey79
Copy link
Contributor

sidey79 commented Feb 25, 2017

man könnte die Nachricht doch mit einer Regex prüfen

In etwa so meine ich das:
https://regex101.com/r/W8BVBm/1

@elektron-bbs
Copy link
Contributor

Das ist aber nur ein Teil der Prüfung. Mir geht es nicht nur um den einen Sensor, sondern um eine ganze Reihe. Das Protokoll ist beschrieben auf: http://www.dc3yc.homepage.t-online.de/protocol.htm
Es gibt verschiedene Anzahl Bits in der Präambel, die Länge der Protokolle ist verschieden und dann gibt es Typ 1 auch noch mit oder ohne Prüfsumme als letztes Nibble. Ich denke, wir müssen schon alle Prüfungen durchführen, so hab ich es zumindest in meiner Eigenbau-Wetterstation gemacht und in der 14_CUL_WS.pm erfolgt ja keinerlei Prüfung, außer auf ungewöhnliche Temperaturänderungen von über 15 Grad.
Eine Prüfung der Länge der Präambel und ob jedes 5. Bit 1 ist, habe ich jetzt schon drin. Trotzdem hat es mir über Nacht 5 zusätzliche Sensoren mit nicht plausiblen Werten angelegt.

@sidey79
Copy link
Contributor

sidey79 commented Feb 26, 2017

Auf meinem Testsystem wurde heute Nacht auch ein Sensor falschen angelegt.

Ich denke, da fehlen min und max length im Protokoll und dann im cul_ws Modul noch ein Autocreate threshhold

@elektron-bbs
Copy link
Contributor

elektron-bbs commented Feb 26, 2017

length_min und length_min habe ich jetzt schon drin. Bei mir sieht das aktuell so aus:

	"60" => ## WS7000, AS2000, ASH2000, S2000, S2001A, S2001IA, ASH2200, S300IA, S2001I, S2001ID, S2500H ##
	# das letzte Bit 1 fehlt immer
	{
		name   			 		=> 'WS7000',
		id					 		=> '60',
		one             		=> [2,-4],
		zero        	 		=> [4,-2],
		clockabs     	 		=> 200,
		preamble      	 		=> 'K',                # prepend to converted message
		postamble     	 		=> '',                  # Append to converted message
		clientmodule  	 		=> 'CUL_WS',
		length_min		 		=> '44',			# eigentlich 45, 1 Bit fehlt immer
		length_max      		=> '80',			# eigentlich 81, 1 Bit fehlt immer
		postDemodulation		=> \&SIGNALduino_postDemo_WS7000,
	}, 

sub SIGNALduino_postDemo_WS7000() {
#$name,@bit_msg
my @bit_msg = @_;
my $name = "sduino_WS7000";
my $debug = AttrVal($name,"debug",0);
my $index = 0;
my @new_bit_msg;
my $Error = 0;

Debug "$name: ########## Beginn SIGNALduino_postDemo_WS7000 ##########" if ($debug);
Debug "$name: bit_msg vor Bearbeitung: @bit_msg" if ($debug);
# Start bei erstem Bit mit Wert 1 suchen
# $bit_msg[9] = 0; # Test Startbit # Test Praeambel
until ($bit_msg[$index] == 1) {
$index++;
}
Debug "$name: Startbit $bit_msg[$index] at pos: $index" if ($debug);
# Fehlerpruefung
if ($index > 10) { # max 10 bits preamble
Debug "$name: Preamble too long: $index" if ($debug);
return 0; # funktioniert nicht richtig!!!
} else {
#my $length_bit_msg = length(@bit_msg)
#Debug "$name: Length of bit_msg: $length_bit_msg" if ($debug);
for(my $i = $index; $i < @bit_msg; $i+=5) {
Debug "$name: Bit $bit_msg[$i] at position: $i" if ($debug);
if (@bit_msg[$i] != 1 ) { # Find errors bit 5
$Error++;
}
}
if ($Error != 0) {
Debug "$name: Checkbits not 1" if ($debug);
return 0; # funktioniert nicht richtig!!!
} else {

		##### Fehlerprüfung einbauen #####
	
		# aus 14_CUL_WS.pm:
		#my $firstbyte = hex($a[1]);		# Adresse
		#my $secondbyte = hex($a[2]);	# Typ
		#if($typbyte == 4 && int(@a) > 10) {          # temp/hum/press
		#$sgn = ($firstbyte&8) ? -1 : 1;
		#$tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1};
		#$hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2};
		#$prs = ($a[12].$a[9].$a[10])+ 200 + $hash->{corr3};

		$index++;																				# first bit of data
		@new_bit_msg[0 .. 3] = reverse @bit_msg[$index+5 .. $index+8];			# [1] Sensoradresse
		@new_bit_msg[4 .. 7] = reverse @bit_msg[$index .. $index+3];			# [2] Sensortyp
		@new_bit_msg[8 .. 11] = reverse @bit_msg[$index+15 .. $index+18];		# [3] Temperatur 1
		@new_bit_msg[12 .. 15] = reverse @bit_msg[$index+10 .. $index+13];	# [4] Temperatur 0,1

		@new_bit_msg[16 .. 19] = reverse @bit_msg[$index+25 .. $index+28];	# [5] Humidity 0,1
		@new_bit_msg[20 .. 23] = reverse @bit_msg[$index+20 .. $index+23];	# [6] Temperatur 10
		@new_bit_msg[24 .. 27] = reverse @bit_msg[$index+35 .. $index+38];	# [7] Humidity 10
		@new_bit_msg[28 .. 31] = reverse @bit_msg[$index+30 .. $index+33];	# [8] Humidity 1

		@new_bit_msg[32 .. 35] = reverse @bit_msg[$index+45 .. $index+48];	# [9] Pressure 10
		@new_bit_msg[36 .. 39] = reverse @bit_msg[$index+40 .. $index+43];	# [10] Pressure 1
		@new_bit_msg[40 .. 43] = reverse @bit_msg[$index+55 .. $index+58];	# [11] Checksum
		@new_bit_msg[44 .. 47] = reverse @bit_msg[$index+50 .. $index+53];	# [12] Pressure 100

		##length 48 - 6 Byte - 12 Halbbyte
		Debug "$name: bit_msg nach Bearbeitung: @new_bit_msg" if ($debug);
		Debug "$name: ########### Ende SIGNALduino_postDemo_WS7000 ########### \n" if ($debug);
		return (@new_bit_msg);
	}
}

}

Irgendwie funktioniert das mit dem Code einfügen nicht so richtig. Ich lass das jetzt aber so.

Was uns auch noch aufgefallen war: Die Variable $name wird der SUB scheinbar nicht übergeben, ich musste das selbst definieren.
Den korrekten returncode bei Fehlern habe ich auch noch nicht hinbekommen. Mit "return 0" wird "K0" an CUL_WS übergeben.

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Feb 26, 2017

Das Thema Fehlerüberprüfung sollte man auf jedenfall nicht nur bei diesem Protokoll verfolgen.
Ich lasse das System soeben auch auf Test laufen und da ist mir neben "unserer" genannten "Fehleranlegung" CUL_WS_x auch noch eine aufgefallen bei SD_WS_X. Ich denke, es wäre auf jedenfall sinnvoll, das man für solche Auffälligkeiten vielleicht dann einen neuen Faden eröffnet.

EDIT - 23:05: Nach dem Einbau von elektron-bbs begonner Fehleranlalyse wurden bisher keine weiteren "Zufallssensoren" angelegt.

@sidey79
Copy link
Contributor

sidey79 commented Feb 27, 2017

Macht ihr noch einen pull request?

@HomeAutoUser HomeAutoUser reopened this Feb 27, 2017
@HomeAutoUser
Copy link
Contributor Author

Macht ihr noch einen Pullover request?

Erfolgt noch. Wird momentan noch dran gearbeitet und getestet.

@sidey79
Copy link
Contributor

sidey79 commented Apr 17, 2017

Zu 2. und 3. habe ich eventuell die Lösung gefunden. Bei 3. bin ich auf deine Hilfe angewiesen. Habe etwas committed, bitte mal testen.
2. schau ich selbst noch mal und bei 1. bin ich gerade etwas ratlos.... hmm da brauche ich noch etwas Zeit.

@elektron-bbs
Copy link
Contributor

So richtig klappt das noch nicht:

2017.04.18 19:44:36 1: sduino: WS2000 Sensortyp 1 Adr 0 - ERROR examination bit

2017.04.18 19:48:35 1: 1: WS2000 Sensortyp 8 - ERROR typ to big

2017.04.18 20:47:25 1: sduino: WS2000 ERROR preamble > 10 (11)

2017.04.18 21:01:18 1: 1: WS2000 Sensortyp 8 - ERROR typ to big

2017.04.18 21:11:02 1: 1: WS2000 Sensortyp 8 - ERROR typ to big

2017.04.18 22:18:10 1: 1: WS2000 Sensortyp 10 - ERROR typ to big
2017.04.18 22:18:10 1: sduino: WS2000 Sensortyp 10 - ERROR typ to big

2017.04.18 23:47:57 1: 1: WS2000 Sensortyp 14 - ERROR typ to big

2017.04.18 23:55:49 1: sduino: WS2000 Sensortyp 8 - ERROR typ to big

2017.04.19 01:48:21 1: 0: WS2000 ERROR preamble > 10 (11)
2017.04.19 01:48:21 1: sduino: WS2000 ERROR preamble > 10 (12)

2017.04.19 04:51:30 1: sduino: WS2000 ERROR preamble > 10 (11)

2017.04.19 05:05:35 1: 0: WS2000 Sensortyp 14 - ERROR typ to big
2017.04.19 05:05:35 1: sduino: WS2000 Sensortyp 14 - ERROR typ to big

2017.04.19 07:30:33 1: 0: WS2000 ERROR preamble > 10 (17)
2017.04.19 07:30:33 1: sduino: WS2000 ERROR preamble > 10 (18)

Den Loglevel habe ich auf 1 gesetzt, sonst ist mir das zu unübersichtlich.
Was auffällt, ist das manchmal "$name" nicht übergeben wird und dann offensichtlich dafür das erste Bit aus "@bit_msg" verwendet wird.
Die Wiederholungen scheinen jetzt nur noch zweimal zu erfolgen.

Die Änderung von:
next if (!$rcode);
in:
next if ($rcode < 1 );
hattest du nur in der Sub "SIGNALduino_Parse_MS($$$$%)" aber nicht in "SIGNALduino_Parse_MU($$$$@)" vorgenommen. War das Absicht?

sidey79 added a commit that referenced this issue Apr 19, 2017
Returncode für SIGNALduino_callsub auch innerhalb SIGNALduino_Parse_MU angepasst #136
@elektron-bbs
Copy link
Contributor

Der Aufruf der sub SIGNALduino_postDemo_WS2000 ohne "$name " erfolgt durch die zuletzt neu hinzu gekommene Zeile in der sub SIGNALduino_callsub:
my $subname = @{[eval {&$method}, $@ =~ /.*/]};
Diese und die darauf folgende Logausgabe habe ich erst mal auskommentiert. Ob die Wiederholungen wieder auftreten, muss ich jetzt erst mal abwarten.

Aus meinem Code (SIGNALduino_postDemo_WS2000) können noch folgende 2 Zeilen entfernt werden:
my $sumindex = 0;
$sumindex = $index + $datastart + 6; # Position Summe
Hatte ich wohl übersehen, das das nicht mehr gebraucht wird.

@sidey79
Copy link
Contributor

sidey79 commented Apr 20, 2017

my $subname = @{[eval {&$method}, $@ =~ /.*/]}; hat ohnehin nicht das gemacht, was ich wollte.
Der Name der Routine kann so leider nur extrahiert werden, wenn es die Routine nicht gibt. Das war zu spät, als ich das implementiert habe :)

Da gibt es aber noch spezielle Funktionen, die wollte ich mir ansehen.

@elektron-bbs
Copy link
Contributor

Die nur manchmal auftretende Wiederholung von Fehlermeldungen hat leider nicht aufgehört:

2017.04.22 16:30:15 1: sduino: WS2000 Sensortyp 7 - ERROR lenght of message 45 (85)
2017.04.22 16:46:59 1: sduino: WS2000 Sensortyp 1 - ERROR lenght of message 35 (50)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)
2017.04.22 16:52:49 1: sduino: WS2000 Sensortyp 2 - ERROR lenght of message 65 (35)

@HomeAutoUser
Copy link
Contributor Author

Hallo,

ich habe mal soeben ein aktuelle Update gemacht um zu testen, ob der WS7000 ohne manuelle Änderungen sofort erkannt wird.

Hallo und Frohe Ostern,
seit langer Zeit finde ich nun mal wieder Zeit mich dem hier zu widmen.
Nachdem ich nun mal ein Update gemacht habe um zu schauen was implementiert wurde bzw. geändert, so fiel mit auf, das einiges umgestellt wurde.
Es wurde Bsp. für den WS7000 an das Modul CUL_WS weiterverwiesen und scheinbar aber nicht die Fehlerüberprüfung eingebaut / weitergegeben. Der WS7000 wird nun bei mir erneut vermehrt zu CUL_WS 1 - x angelegt und kein echter WS7000 Wert außer "Müll" Das ist ein RÜCKSCHRITT!

Das ganze scheint bei mir nun zu klappen.
Danke für die Aktualisierung. Die "Fehlerrate" kann ich erst in ein paar Tagen beurteilen.

MfG

@elektron-bbs
Copy link
Contributor

elektron-bbs commented May 24, 2017

Da ich jetzt irgendwo im Netz eine Erläuterung zu den Parametern "clockabs", "zero" und "one" gefunden habe, habe ich die Parameter angepasst:

  "60" =>	## ELV, LA CROSSE (WS2000/WS7000)
  {
     # MU;P0=32001;P1=-381;P2=835;P3=354;P4=-857;D=01212121212121212121343421212134342121213434342121343421212134213421213421212121342121212134212121213421212121343421343430;CP=2;R=53;			# tested sensors:  	WS-7000-20, AS2000, ASH2000, S2000, S2000I, S2001A, S2001IA,
     #                    ASH2200, S300IA, S2001I, S2000ID, S2001ID, S2500H 
     # not tested:        AS3, S2000W, S2000R, WS7000-15, WS7000-16, WS2500-19, S300TH, S555TH
     # das letzte Bit 1 und 1 x 0 Preambel fehlt meistens
     #  ___        _
     # |   |_     | |___
     #  Bit 0      Bit 1
     # kurz 366 µSek / lang 854 µSek / gesamt 1220 µSek - Sollzeiten 
     name                 => 'WS2000',
     id                   => '60',
     one                  => [3,-7],	
     zero                 => [7,-3],
     clockabs             => 122,
     preamble      	 	   => 'K',        # prepend to converted message
     postamble     	 	   => '',         # Append to converted message
     clientmodule         => 'CUL_WS',   
     length_min           => '44',	      # eigentlich 46
     length_max           => '82',	      # eigentlich 81
		postDemodulation     => \&SIGNALduino_postDemo_WS2000,
	}, 

Außerdem können aus meinem Code (SIGNALduino_postDemo_WS2000) noch folgende 2 Zeilen entfernt werden:
my $sumindex = 0;
$sumindex = $index + $datastart + 6; # Position Summe
Hatte ich wohl übersehen, das das nicht mehr gebraucht wird.

"manchesterMC" muss bei mir weiterhin ausschaltet bleiben, da der meiste Teil der Nachrichten sonst als Manchester deklariert wird.

Die bereits erwähnte Wiederholung von Fehlermeldungen passiert immer noch manchmal.

@elektron-bbs
Copy link
Contributor

elektron-bbs commented Jun 8, 2017

Da auch diese Korrektur noch nicht eingearbeitet wurde, melde ich mich nochmal. Bitte ändert mal die im letzten Post geänderte Definition.
Außerdem habe ich in der "sub SIGNALduino_postDemo_WS2000" Korrekturen vorgenommen (siehe letztes Posting). Die Loglevel der Fehlermeldungen habe ich auf 3 gesetzt:

sub SIGNALduino_postDemo_WS2000($@) {
my ($name, @bit_msg) = @_;
my $debug = AttrVal($name,"debug",0);
my @new_bit_msg = "";
my $protolength = scalar @bit_msg;
my @datalenghtws = (35,50,35,50,70,40,40,85);
my $datastart = 0;
my $datalength = 0;
my $datalength1 = 0;
my $index = 0;
my $data = 0;
my $dataindex = 0;
my $error = 0;
my $check = 0;
my $sum = 5;
my $typ = 0;
my $adr = 0;
my @sensors = (
"Thermo",
"Thermo/Hygro",
"Rain",
"Wind",
"Thermo/Hygro/Baro",
"Brightness",
"Pyrano",
"Kombi"
);

while ($bit_msg[$datastart] == 0) { $datastart++; }	# Start bei erstem Bit mit Wert 1 suchen
$datalength = $protolength - $datastart;
$datalength1 = $datalength - ($datalength % 5);  		# modulo 5
Log3 $name, 5, "$name: WS2000 protolength: $protolength, datastart: $datastart, datalength $datalength";
$typ = oct( "0b".(join "", reverse @bit_msg[$datastart + 1.. $datastart + 4]));		# Sensortyp
if ($typ > 7) {
	Log3 $name, 3, "$name: WS2000 Sensortyp $typ - ERROR typ to big";
	return 0, undef;
}
if ($typ == 1 && ($datalength == 45 || $datalength == 46)) {$datalength1 += 5;}		# Typ 1 ohne Summe
if ($datalenghtws[$typ] != $datalength1) {												# check lenght of message
	Log3 $name, 3, "$name: WS2000 Sensortyp $typ - ERROR lenght of message $datalength1 ($datalenghtws[$typ])";
	return 0, undef;
} elsif ($datastart > 10) {									# max 10 Bit preamble
	Log3 $name, 3, "$name: WS2000 ERROR preamble > 10 ($datastart)";
	return 0, undef;
} else {
	do {
		$error += !$bit_msg[$index + $datastart];			# jedes 5. Bit muss 1 sein
		$dataindex = $index + $datastart + 1;				 
		$data = oct( "0b".(join "", reverse @bit_msg[$dataindex .. $dataindex + 3]));
		if ($index == 5) {$adr = ($data & 0x07)}			# Sensoradresse
		if ($datalength == 45 || $datalength == 46) { 	# Typ 1 ohne Summe
			if ($index <= $datalength - 5) {
				$check = $check ^ $data;		# Check - Typ XOR Adresse XOR � bis XOR Check muss 0 ergeben
			}
		} else {
			if ($index <= $datalength - 10) {
				$check = $check ^ $data;		# Check - Typ XOR Adresse XOR � bis XOR Check muss 0 ergeben
				$sum += $data;
			}
		}
		$index += 5;
	} until ($index >= $datalength);
}
if ($error != 0) {
	Log3 $name, 3, "$name: WS2000 Sensortyp $typ Adr $adr - ERROR examination bit";
	return (0, undef);
} elsif ($check != 0) {
	Log3 $name, 3, "$name: WS2000 Sensortyp $typ Adr $adr - ERROR check XOR";
	return (0, undef);
} else {
	if ($datalength < 45 || $datalength > 46) { 			# Summe prüfen, außer Typ 1 ohne Summe
		$data = oct( "0b".(join "", reverse @bit_msg[$dataindex .. $dataindex + 3]));
		if ($data != ($sum & 0x0F)) {
			Log3 $name, 3, "$name: WS2000 Sensortyp $typ Adr $adr - ERROR sum";
			return (0, undef);
		}
	}
	Log3 $name, 4, "$name: WS2000 Sensortyp $typ Adr $adr - $sensors[$typ]";
	$datastart += 1;																							# [x] - 14_CUL_WS
	@new_bit_msg[4 .. 7] = reverse @bit_msg[$datastart .. $datastart+3];						# [2]  Sensortyp
	@new_bit_msg[0 .. 3] = reverse @bit_msg[$datastart+5 .. $datastart+8];					# [1]  Sensoradresse
	@new_bit_msg[12 .. 15] = reverse @bit_msg[$datastart+10 .. $datastart+13];				# [4]  T 0.1, R LSN, Wi 0.1, B   1, Py   1
	@new_bit_msg[8 .. 11] = reverse @bit_msg[$datastart+15 .. $datastart+18];				# [3]  T   1, R MID, Wi   1, B  10, Py  10
	if ($typ == 0 || $typ == 2) {		# Thermo (AS3), Rain (S2000R, WS7000-16)
		@new_bit_msg[16 .. 19] = reverse @bit_msg[$datastart+20 .. $datastart+23];			# [5]  T  10, R MSN
	} else {
		@new_bit_msg[20 .. 23] = reverse @bit_msg[$datastart+20 .. $datastart+23];			# [6]  T  10, 			Wi  10, B 100, Py 100
		@new_bit_msg[16 .. 19] = reverse @bit_msg[$datastart+25 .. $datastart+28];			# [5]  H 0.1, 			Wr   1, B Fak, Py Fak
		if ($typ == 1 || $typ == 3 || $typ == 4 || $typ == 7) {	# Thermo/Hygro, Wind, Thermo/Hygro/Baro, Kombi
			@new_bit_msg[28 .. 31] = reverse @bit_msg[$datastart+30 .. $datastart+33];		# [8]  H   1,			Wr  10
			@new_bit_msg[24 .. 27] = reverse @bit_msg[$datastart+35 .. $datastart+38];		# [7]  H  10,			Wr 100
			if ($typ == 4) {	# Thermo/Hygro/Baro (S2001I, S2001ID)
				@new_bit_msg[36 .. 39] = reverse @bit_msg[$datastart+40 .. $datastart+43];	# [10] P    1
				@new_bit_msg[32 .. 35] = reverse @bit_msg[$datastart+45 .. $datastart+48];	# [9]  P   10
				@new_bit_msg[44 .. 47] = reverse @bit_msg[$datastart+50 .. $datastart+53];	# [12] P  100
				@new_bit_msg[40 .. 43] = reverse @bit_msg[$datastart+55 .. $datastart+58];	# [11] P Null
			}
		}
	}
	return (1, @new_bit_msg);
}

}

sidey79 added a commit that referenced this issue Jun 10, 2017
added improvements from #136
@elektron-bbs
Copy link
Contributor

Danke für den Einbau.
Die Änderung des Loglevels der Fehlermeldungen von 4 auf 3 wolltest du wohl nicht einbauen? Da scheinen ja die Meinungen auseinander zu gehen.

@sidey79
Copy link
Contributor

sidey79 commented Jun 11, 2017

Stimmt. Im Normalfall braucht ein Anwender diese Meldungen nicht. Was soll er damit machen?

Wenn etwas zu analysieren ist, da es ein Problem gibt, kann man doch den verbose level auf 4 stellen.

@elektron-bbs
Copy link
Contributor

Naja, gefällt mir eigentlich nicht. Bei Level 4 kommt gleich wieder zu viel Schrott ins Log, den man im Normalfall nicht braucht. Ich würde im Normalfall (Level 3) schon gern die Fehler sehen und kann dem dann auf den Grund gehen, wenn es zu viel wird. Euch als Entwickler spart deine Ansicht natürlich lästige Nachfragen, weil Otto-Normaluser die Fehler gar nicht erst zu sehen bekommt.

@sidey79
Copy link
Contributor

sidey79 commented Aug 2, 2017

So, nach langer Zeit wollte ich doch zumindest jetzt einmal einen Informationsstand bekanntgeben.

Wie vermutet, ist in dem MCDecoder ein Bug, so dass er dieses Signal als MC erkennt, obwohl es keines ist.
Ich habe mich nun die letzten Tage damit beschäftigt. Ich muss mir da noch etwas einfallen lassen, damit der fix keine neuen Probleme verursacht.

@sidey79
Copy link
Contributor

sidey79 commented Aug 16, 2017

@Ralf9 @HomeAutoUser
ich habe an den MC Decoder angepasst.
In meinen Versuchen, wird das 1. Bit nun wieder invertiert erkannt. Eventuell eher richtiger als vor. Ganz sicher bin ich mir da nicht. Die Spezifikation wertet erst ab dem ersten langen puls aus und das habe ich etwas optimiert.

Ich habe eine angepasste Firware für Arduino Nano mit cc1101 compiliert:
https://drive.google.com/file/d/0B3UU1FxM6ZDUY1lJQUlJRmhxSGM/view?usp=sharing

Bitte mal insbesondere auch auf MC Empfang testen. Eventuell muss noch etwas im FHEM Modul oder auch im Arduino code angepasst werden.

@HomeAutoUser
Copy link
Contributor Author

Hallo,
ich werde es mal testen @sidey79.
Sollte es @elektron-bbs noch nicht gelesen haben, so kann er dies auch mal testen.

@Ralf9
Copy link
Contributor

Ralf9 commented Aug 20, 2017

Ich habe gerade kein Nano mit cc1101 aufgebaut. Ich verwende ein 3,3V pro mini, da ich dazu keine levelshifter benötige.
@pejonp hast Du einen Nano mit cc1101 mit dem Du den MC Empfang testen kannst.

Bitte dann die raw-Nachrichten vom MC Sensor hier posten. Ich kann es mir dann auch mal anschauen.

@elektron-bbs
Copy link
Contributor

Da bei mir auch kein Nano mit CC1101 in Verwendung ist, habe ich mir den Branch dev-r33_fixmc geladen und für meinen Radino compiliert. Ich hoffe, @sidey79 hat auch diesen verwendet, passt zumindest vom Änderungsdatum dazu.

Meine Sensoren werden jedenfalls jetzt alle als "MU" erkannt, auch nachdem ich "MC" wieder aktiviert habe. Das musste ich ja bisher abschalten. Der SIGNALduino läuft mit dieser Version seit 30 Minuten. Die Sensoren senden im Takt von knapp 180 Sekunden:
empfang_signalduino-dev-r33_fixmc

@pejonp
Copy link
Contributor

pejonp commented Aug 20, 2017

@ralf die neue version habe ich mir runtergeladen und compiliert und lasse sie jetzt auf einem nano + cc1101 laufen. bis jetzt werden alle sensoren angezeigt. kann noch nichts negativen fetstellen.

@sidey79
Copy link
Contributor

sidey79 commented Aug 20, 2017

@Ralf9

Hier auch eine Version für den Arduino pro mini (3v3):
https://drive.google.com/file/d/0B3UU1FxM6ZDULWxqTnBXZkFFRHc/view?usp=sharing

@elektron-bbs
Ja der dev-r33_fixmc ist der richtige branch. Du hast doch recht viele Sensoren :)

@HomeAutoUser
Copy link
Contributor Author

@sidey79

Ich habe eine angepasste Firware für Arduino Nano mit cc1101 compiliert:
https://drive.google.com/file/d/0B3UU1FxM6ZDUY1lJQUlJRmhxSGM/view?usp=sharing

Kannst du bitte das File auch im Hex-Format zur Verfügung stellen.

@sidey79
Copy link
Contributor

sidey79 commented Aug 21, 2017

Für welchen Mikrocontroller brauchst Du die Datei?

Gesendet von meinem Motorola XT1650 mit FastHub

@Ralf9
Copy link
Contributor

Ralf9 commented Aug 22, 2017

@sidey79

Hier auch eine Version für den Arduino pro mini (3v3)

Ich habe damit mal mit einem Bresser Sensor (Hideki) den MC- Empfang getestet. Der Empfang ist damit ähnlich gut wie vorher.
Ich hatte den Eindruck, daß die Empfangsqualität geringfügig schlechter geworden ist.
Mit der vorherigen Version wurden ein klein wenig mehr korrekte Wiederholungen empfangen.
Es ist aber trotzdem noch ausreichend.

@Ralf9
Copy link
Contributor

Ralf9 commented Aug 24, 2017

ich habe an den MC Decoder angepasst.
In meinen Versuchen, wird das 1. Bit nun wieder invertiert erkannt.

Ich habe es nochmals getestet. Dazu habe zum Dekodieren der nicht invertierten Nachrichten die ID 12.1 zugefügt:

	"12.1"    => 			## hideki
		{
            name			=> 'Hideki protocol***',	
			id          	=> '12',
			clockrange     	=> [420,510],                   # min, max better for Bresser Sensors, OK for hideki/Hideki/TFA too     
			format 			=> 'manchester',	
			preamble		=> 'P12#',						# prepend to converted message	
			clientmodule    => 'hideki',   				# not used now
			modulematch     => '^P12#75.+',  						# not used now
			length_min      => '71',
			length_max      => '128',
			method          => \&SIGNALduino_Hideki,	# Call to process this message
			#polarity        => 'invert',			
		},

Bei diesen Zeilen habe ich das loglevel von 4 auf 3 geändert

			if (defined($rssi)) {
				Log3 $name, 3, "$name: Found manchester Protocol id $id clock $clock RSSI $rssi -> $ProtocolListSIGNALduino{$id}{name}";
			} else {
				Log3 $name, 3, "$name: Found manchester Protocol id $id clock $clock -> $ProtocolListSIGNALduino{$id}{name}";
			}

und mit dieser whitelist
attr sduino whitelist_IDs 12,12.1

habe ich im Event monitor folgendes erhalten. Da ist erkennbar, daß recht viele Nachrichten als id 12.1 (nicht invertiert) erkannt werden.
Ich habe dann auch nochmal eine Version ohne den mcfix getestet, damit wurden dann keine nicht invertierten Nachrichten (id 12.1) erkannt.

2017.08.24 20:35:12.378 3 : sduino: Found manchester Protocol id 12.1 clock 485 RSSI -51 -> Hideki protocol***
2017-08-24 20:35:12.383 Hideki Hideki_30_d4.5 T: 22.1 H: 71

2017.08.24 20:35:13.008 3 : sduino: Found manchester Protocol id 12.1 clock 486 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:35:13.009 Hideki Hideki_30_d4.5 T: 22.1 H: 71

2017.08.24 20:36:03.377 3 : sduino: Found manchester Protocol id 12 clock 485 RSSI -50 -> Hideki protocol
2017-08-24 20:36:03.383 Hideki Hideki_30_d4.5 T: 22.1 H: 71

2017.08.24 20:36:54.360 3 : sduino: Found manchester Protocol id 12.1 clock 485 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:36:54.364 Hideki Hideki_30_d4.5 T: 22.2 H: 71
2017.08.24 20:36:54.520 3 : sduino: Found manchester Protocol id 12.1 clock 487 RSSI -50.5 -> Hideki protocol***
2017-08-24 20:36:54.521 Hideki Hideki_30_d4.5 T: 22.2 H: 71

2017.08.24 20:37:45.390 3 : sduino: Found manchester Protocol id 12 clock 485 RSSI -50 -> Hideki protocol
2017-08-24 20:37:45.392 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:38:36.387 3 : sduino: Found manchester Protocol id 12.1 clock 484 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:38:36.389 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:38:37.001 3 : sduino: Found manchester Protocol id 12 clock 486 RSSI -72.5 -> Hideki protocol
2017-08-24 20:38:37.002 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:39:27.381 3 : sduino: Found manchester Protocol id 12 clock 487 RSSI -72.5 -> Hideki protocol
2017-08-24 20:39:27.383 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:40:18.377 3 : sduino: Found manchester Protocol id 12.1 clock 486 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:40:18.379 Hideki Hideki_30_d4.5 T: 22.2 H: 70
2017.08.24 20:40:18.998 3 : sduino: Found manchester Protocol id 12 clock 487 RSSI -50 -> Hideki protocol
2017-08-24 20:40:18.000 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:41:09.383 3 : sduino: Found manchester Protocol id 12.1 clock 483 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:41:09.388 Hideki Hideki_30_d4.5 T: 22.1 H: 70
2017.08.24 20:41:09.981 3 : sduino: Found manchester Protocol id 12.1 clock 486 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:41:09.982 Hideki Hideki_30_d4.5 T: 22.1 H: 70

2017.08.24 20:42:00.361 3 : sduino: Found manchester Protocol id 12 clock 486 RSSI -72.5 -> Hideki protocol
2017-08-24 20:42:00.363 Hideki Hideki_30_d4.5 T: 22.2 H: 70
2017.08.24 20:42:00.526 3 : sduino: Found manchester Protocol id 12.1 clock 487 RSSI -51 -> Hideki protocol***
2017-08-24 20:42:00.528 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:42:51.380 3 : sduino: Found manchester Protocol id 12 clock 485 RSSI -72.5 -> Hideki protocol
2017-08-24 20:42:51.385 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:43:42.378 3 : sduino: Found manchester Protocol id 12 clock 486 RSSI -72.5 -> Hideki protocol
2017-08-24 20:43:42.383 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:43:42.993 3 : sduino: Found manchester Protocol id 12.1 clock 485 RSSI -72.5 -> Hideki protocol***
2017-08-24 20:43:42.994 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:44:33.393 3 : sduino: Found manchester Protocol id 12.1 clock 486 RSSI -50 -> Hideki protocol***
2017-08-24 20:44:33.396 Hideki Hideki_30_d4.5 T: 22.2 H: 70

2017.08.24 20:46:15.363 3 : sduino: Found manchester Protocol id 12 clock 486 RSSI -72.5 -> Hideki protocol
2017-08-24 20:46:15.368 Hideki Hideki_30_d4.5 T: 22.1 H: 70
2017.08.24 20:46:15.528 3 : sduino: Found manchester Protocol id 12.1 clock 486 RSSI -50 -> Hideki protocol***
2017-08-24 20:46:15.530 Hideki Hideki_30_d4.5 T: 22.1 H: 70

@sidey79
Copy link
Contributor

sidey79 commented Aug 25, 2017

@Ralf9:
Das mit dem Invertiert empfangen ist doch aus einer Anpassung im MAC Decoder entstanden. Ich glaube, die war nicht ganz richtig.

So wie es jetzt übergeben wird, (nicht Invertiert) müsste es korrekt sein.
Was mich wundert ist aber, dass es manchmal Invertiert und manchmal nicht Invertiert sein soll.
Dem würde ich gerne auf den Grund gehen, weiss aktuell nur noch nicht wie :)

Gesendet von meinem Motorola XT1650 mit FastHub

@elektron-bbs
Copy link
Contributor

Da die Arbeiten an dem FHT80TF ( #171 ) noch etwas dauern, möchte ich den Fehler, der dort aufgefallen ist und auch beim WS2000 auftreten könnte, hier korrigieren.
In der sub SIGNALduino_postDemo_WS2000 müsste deshalb die Zeile:

while ($bit_msg[$datastart] == 0) { $datastart++; }	# Start bei erstem Bit mit Wert 1 suchen

durch diesen Code ersetzt werden:

for ($datastart = 0; $datastart < $protolength; $datastart++) {   # Start bei erstem Bit mit Wert 1 suchen
	last if $bit_msg[$datastart] eq "1";
}
if ($datastart == $protolength) {                                 # all bits are 0
	Log3 $name, 3, "$name: WS2000 - ERROR message all bit are zeros";
	return 0, undef;
}

@HomeAutoUser
Copy link
Contributor Author

Da das Protokoll WS7000 eingearbeitet wurde und die Anpassungen von @elektron-bbs ebenso eingerarbeitet wurden, so schließe ich das Thema.
Andere Theme bitte unter dem dazugehörigen Faden führen.
Ich möchte gern die Ordnung ein wenig behalten bzw. schaffen ;-) um die Übersichtlichkeit für @sidey79 und @Ralf9 und co zu gewährleisten.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants