﻿% Skript för hämtning av värden från de trådlösa Elvacogivarna CMa10/11W via 
% Elvaco CMeX50. 
% Viktigt är att sätta nedanstående i CMeX50. Se manualen för CMeX50 för hur du gör dessa
% inställningar
% DIF/VIF mode ska vara satt i läge "Auto address"
% Wired M-bus mode ska vara satt i läge "Auto"
% Abelko Innovation, Marcus Willander 20130807
% Om du vill ha medelvärden från alla givare kan du lägga till enheten som heter Medelvärden CMa10W
DEVICETYPE CMa10W NAMED "Elvaco CMa10W" TYPEID 424
IS
  PARAMETER
    Id :"Address"INT;
  PUBLIC
    IdNr     : "Mätar ID" [""]INT;
    Tcurrent : "Temperatur"["°C"]DEC2;
    Tmean1   : "1h medeltemp" ["°C"]DEC2;
    Tmean24  : "24h medeltemp" ["°C"]DEC2;
    Tmin24   : "24h mintemp" ["°C"]DEC2;
    Tmax24   : "24h maxtemp" ["°C"]DEC2;

    Hcurrent : "Luftfuktighet"["% RH"]DEC1;
    Hmean1   : "1h medelfukt."["% RH"]DEC1;
    Hmean24  : "24h medelfukt."["% RH"]DEC1;
    Hmin24   : "24h minfukt."["% RH"]DEC1;
    Hmax24   : "24h maxfukt."["% RH"]DEC1;
  PRIVATE
    Exp;
    tmp1;
  BAUDRATE 2400;
  PARITY EVEN;
  CHECKSUM SUM8 SKIP 4;
  POSTBYTES 1;
  
  TELEGRAM Read NAMED "Läs mätdata" IS
    QUESTION
      DATA[0] := HEX(10);
      DATA[1] := HEX(4B);
      DATA[2] := BYTE(Id);
      DATA[3] <- BYTE(DATA :=Id+75;);
      DATA[4] := HEX(16);
    ANSWER SIZE 103
      DATA[0] = HEX(68);
      DATA[1] = HEX(61);
      DATA[2] = HEX(61);
      DATA[3] = HEX(68);
      DATA[4] = HEX(08);
      DATA[5] = BYTE(Id);
      DATA[6] = HEX(72);
      DATA[7] ->WORD(tmp1:=DATA;);
      DATA[9] ->WORD(IdNr:=tmp1+65536*DATA;);
      DATA[21]= HEX(02);
      DATA[22]= HEX(65);
      DATA[23]->WORD( IF DATA & 32768 THEN Tcurrent:=(DATA-65536)/100; ELSE Tcurrent:=DATA/100;ENDIF; );
      DATA[27]->WORD(IF DATA & 32768 THEN Tmean1:=(DATA-65536)/100; ELSE Tmean1:=DATA/100;ENDIF; );
      DATA[32]->WORD(IF DATA & 32768 THEN Tmean24:=(DATA-65536)/100; ELSE Tmean24:=DATA/100;ENDIF; );
      DATA[44]->WORD(IF DATA & 32768 THEN Tmin24:=(DATA-65536)/100; ELSE Tmin24:=DATA/100;ENDIF; );
      DATA[48]->WORD(IF DATA & 32768 THEN Tmax24:=(DATA-65536)/100; ELSE Tmax24:=DATA/100;ENDIF; );
      DATA[50]= HEX(02);
      DATA[51]= HEX(FB);
      DATA[52]= HEX(1A);
      DATA[53]->WORD(Hcurrent:=DATA/10;);
      DATA[58]->WORD(Hmean1:=DATA/10;);
      DATA[64]->WORD(Hmean24:=DATA/10;);
      DATA[79]->WORD(Hmin24:=DATA/10;);
      DATA[84]->WORD(Hmax24:=DATA/10;);
    TIMEOUT 5000
  END;
END;

% Använd detta skript om du inte har lyckats få bort container mode i CMeX50.
DEVICETYPE CMa10W_ NAMED "Elvaco CMa10W_" TYPEID 425
IS
  PARAMETER
    Id :"Address"INT;
  PUBLIC
    IdNr     : "Mätar ID" [""]INT;
    Tcurrent : "Temperatur"["°C"]DEC2;
    Tmean1   : "1h medeltemp" ["°C"]DEC2;
    Tmean24  : "24h medeltemp" ["°C"]DEC2;
    Tmin24   : "24h mintemp" ["°C"]DEC2;
    Tmax24   : "24h maxtemp" ["°C"]DEC2;

    Hcurrent : "Luftfuktighet"["% RH"]DEC1;
    Hmean1   : "1h medelfukt."["% RH"]DEC1;
    Hmean24  : "24h medelfukt."["% RH"]DEC1;
    Hmin24   : "24h minfukt."["% RH"]DEC1;
    Hmax24   : "24h maxfukt."["% RH"]DEC1;
  PRIVATE
    Exp;
    tmp1;
  BAUDRATE 2400;
  PARITY EVEN;
  CHECKSUM SUM8 SKIP 4;
  POSTBYTES 1;
  
  TELEGRAM Read NAMED "Läs mätdata" IS
    QUESTION
      DATA[0] := HEX(10);
      DATA[1] := HEX(7B);
      DATA[2] := BYTE(Id);
      DATA[3] <- BYTE(DATA :=Id+123;);
      DATA[4] := HEX(16);
    ANSWER SIZE 117
      DATA[0] = HEX(68);
      DATA[1] = HEX(6F);
      DATA[2] = HEX(6F);
      DATA[3] = HEX(68);
      DATA[4] = HEX(08);
      DATA[5] = BYTE(Id);
      DATA[6] = HEX(72);
      DATA[21] ->WORD(tmp1:=DATA;);
      DATA[23] ->WORD(IdNr:=tmp1+65536*DATA;);
      DATA[35]= HEX(02);
      DATA[36]= HEX(65);
      DATA[37]->WORD( IF DATA & 32768 THEN Tcurrent:=(DATA-65536)/100; ELSE Tcurrent:=DATA/100;ENDIF; );
      DATA[41]->WORD(IF DATA & 32768 THEN Tmean1:=(DATA-65536)/100; ELSE Tmean1:=DATA/100;ENDIF; );
      DATA[46]->WORD(IF DATA & 32768 THEN Tmean24:=(DATA-65536)/100; ELSE Tmean24:=DATA/100;ENDIF; );
      DATA[58]->WORD(IF DATA & 32768 THEN Tmin24:=(DATA-65536)/100; ELSE Tmin24:=DATA/100;ENDIF; );
      DATA[62]->WORD(IF DATA & 32768 THEN Tmax24:=(DATA-65536)/100; ELSE Tmax24:=DATA/100;ENDIF; );
      DATA[64]= HEX(02);
      DATA[65]= HEX(FB);
      DATA[66]= HEX(1A);
      DATA[67]->WORD(Hcurrent:=DATA/10;);
      DATA[72]->WORD(Hmean1:=DATA/10;);
      DATA[78]->WORD(Hmean24:=DATA/10;);
      DATA[93]->WORD(Hmin24:=DATA/10;);
      DATA[98]->WORD(Hmax24:=DATA/10;);
    TIMEOUT 5000
  END;