Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Actibus

Medlemmer
  • Innlegg

    551
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    16

Alt skrevet av Actibus

  1. Det er fordi Apple har sin egen protokoll (ikke z-wave) og derfor fibaro har laget en egen serie som kun virker mot Apple homekit
  2. Man kan jo kjøre HomeSeer på et eget nettverk uten tilgang til internett, men da forsatt lokal styring med egen pad eller bytte wifi på telefon. Z-wave og zigbee er ikke avhengig av nett. Tror også Domoticz fungerer fint uten internett @deve87?
  3. Den koden jeg har er jo laget for Aidon sin uoffisielle firmware, så virker nok ikke med kamstrup
  4. @GeneralVirus her er den, uten at jeg egentlig har fått ryddet noe mer opp i den, når noe fungerer så blir det fort bare værende sånn. Opprett en tom API for NodeMcu dra plugin, lim inn dette før du kommer til: //************Do not change anything after Here***************** etter loop() er ferdig /************************************************************* Arduino to Homeseer 3 Plugin API written by Enigma Theatre. V1.0.0.146 * * *************************************************************/ int FromHS[50]; boolean IsConnected = false; //************************************************************ //**************Declare your variables here******************* #include <EEPROM.h> #include <ESP8266WiFi.h> //JSON #include <ESP8266HTTPClient.h> //JSON SLUTT static const byte EEPROM_INITIALIZED_MARKER = 0xF1; //Just a magic number static const uint8_t HAN_RX_PIN = 3; int effekt; int total; short volt1; short volt2; short volt3; short frekvens; int forrigeEffekt; static const int DATABUFFER_LENGTH = 256; uint8_t data_buffer[DATABUFFER_LENGTH]; volatile int databuffer_pos; volatile bool buffer_overflow; volatile unsigned long databuffer_receive_time; static unsigned long MINIMUM_TIME_BETWEEN_PACKETS = 1000L; static const uint8_t SLIP_END = 0xC0; static const uint8_t SLIP_ESC = 0xDB; static const uint8_t SLIP_ESC_END = 0xDC; static const uint8_t SLIP_ESC_ESC = 0xDD; static const unsigned CRC16_XMODEM_POLY = 0x1021; static const SerialConfig SERIAL_MODE = SERIAL_8N1; void read_persistent_string(char* s, int max_length, int& adr) { int i = 0; byte c; do { c = EEPROM.read(adr++); if (i<max_length) { s[i++] = static_cast<char>(c); } } while (c!=0); s[i] = 0; } void write_persistent_string(const char* s, size_t max_length, int& adr) { for (int i=0; i<std::min(strlen(s), max_length); i++) { EEPROM.write(adr++, s[i]); } EEPROM.write(adr++, 0); } void serialEvent() { unsigned long now = millis(); if (now<databuffer_receive_time || (now-databuffer_receive_time)>MINIMUM_TIME_BETWEEN_PACKETS) { databuffer_pos = 0; buffer_overflow = false; databuffer_receive_time = now; } uint8_t b; while (Serial.available()) { b = Serial.read(); if (0==databuffer_pos && SLIP_END==b) //FRAME_END can be sent to force reset of buffer { continue; } if ((databuffer_pos+1) < DATABUFFER_LENGTH) //Room for one more byte? { //ESC ESC_END => END (0xDB 0xDC => 0xC0) //ESC ESC_ESC => ESC (0xDB 0xDD => 0xDB) if (databuffer_pos>0 && SLIP_ESC==data_buffer[databuffer_pos-1]) { if (SLIP_ESC_END==b) { data_buffer[databuffer_pos-1] = SLIP_END; continue; } else if (SLIP_ESC_ESC==b) { //data_buffer[databuffer_pos-1] = SLIP_ESC; //Already has this value continue; } } data_buffer[databuffer_pos++] = b; } else { buffer_overflow = true; } } } char* toHex(char* buffer, unsigned int value) { buffer[0]='0'; buffer[1]='x'; uint8_t length = value<256?2:4; for (uint8_t i=length; i>0; i--) { buffer[i+1] = ((value&0x000F)<=9?'0':'A'-10)+(value&0x000F); value = value >> 4; } buffer[length+2] = 0; return buffer; } void dumpHex(const uint8_t* data_buffer, int databuffer_pos, String& response, uint8_t start_pos, uint8_t length) { char tmp_buffer[7]; if(start_pos!=0) { response += "\n"; } response.concat(toHex(tmp_buffer, start_pos)); response += ":"; for (int i=0; i<length && (start_pos+i)<databuffer_pos; i++) { response += " "; response.concat(toHex(tmp_buffer, data_buffer[start_pos+i])); } } unsigned int hexToInt(const uint8_t* data_buffer, int databuffer_pos, uint8_t start_pos) { return ((start_pos+4)>databuffer_pos) ? 0 : data_buffer[start_pos+3]<<24 | data_buffer[start_pos+2]<<16 | data_buffer[start_pos+1]<<8 | data_buffer[start_pos]; } unsigned short hexToShort(const uint8_t* data_buffer, int databuffer_pos, uint8_t start_pos) { return ((start_pos+2)>databuffer_pos) ? 0 : data_buffer[start_pos+1]<<8 | data_buffer[start_pos]; } boolean validCrc16(const uint8_t* data_buffer, int databuffer_pos, uint8_t content_start_pos, uint8_t content_length, uint8_t crc_start_pos) { if ((content_start_pos+content_length)>databuffer_pos || (crc_start_pos+2)>databuffer_pos) { return false; } unsigned crc = 0; for (uint8_t i=0; i<content_length; i++) { crc ^= ((unsigned)data_buffer[content_start_pos+i]) << 8; for (uint8_t j=0; j<8; j++) { crc = crc&0x8000 ? (crc<<1)^CRC16_XMODEM_POLY : crc<<1; } } unsigned short actual_crc = hexToShort(data_buffer, databuffer_pos, crc_start_pos); return crc==actual_crc; } void handleRequest() { String response; dumpHex(data_buffer, databuffer_pos, response, 0, 16); response.concat(F("\tMålernummer: \"")); for (uint8_t i=0; i<16; i++) { response.concat((char)data_buffer[i]); } response.concat(F("\"")); dumpHex(data_buffer, databuffer_pos, response, 16, 4); response.concat(F("\tAkkumulert forbruk: ")); response.concat(hexToInt(data_buffer, databuffer_pos, 16)/1000.0); response.concat(F("MWh")); total = hexToInt(data_buffer, databuffer_pos, 16)/1000.0; dumpHex(data_buffer, databuffer_pos, response, 20, 28); dumpHex(data_buffer, databuffer_pos, response, 48, 4); response.concat(F("\tForbruk: ")); response.concat(hexToInt(data_buffer, databuffer_pos, 48)); response.concat(F("W")); effekt = hexToInt(data_buffer, databuffer_pos, 48); dumpHex(data_buffer, databuffer_pos, response, 52, 12); dumpHex(data_buffer, databuffer_pos, response, 64, 2); response.concat(F("\tStrøm fase 1: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 64)); response.concat(F("mA")); dumpHex(data_buffer, databuffer_pos, response, 66, 4); dumpHex(data_buffer, databuffer_pos, response, 70, 2); response.concat(F("\tStrøm fase 2: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 70)); response.concat(F("mA")); dumpHex(data_buffer, databuffer_pos, response, 72, 6); dumpHex(data_buffer, databuffer_pos, response, 78, 2); response.concat(F("\tStrøm fase 3: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 78)); response.concat(F("mA")); dumpHex(data_buffer, databuffer_pos, response, 80, 2); dumpHex(data_buffer, databuffer_pos, response, 82, 2); response.concat(F("\tSpenning fase 1: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 82)/10.0); response.concat(F("V")); if (hexToShort(data_buffer, databuffer_pos, 82) != 0) { volt1 = hexToShort(data_buffer, databuffer_pos, 82)/10.0; } dumpHex(data_buffer, databuffer_pos, response, 84, 2); response.concat(F("\tSpenning fase 2: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 84)/10.0); response.concat(F("V")); if (hexToShort(data_buffer, databuffer_pos, 84) != 0) { volt2 = hexToShort(data_buffer, databuffer_pos, 84)/10.0; } dumpHex(data_buffer, databuffer_pos, response, 86, 2); response.concat(F("\tSpenning fase 3: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 86)/10.0); response.concat(F("V")); if (hexToShort(data_buffer, databuffer_pos, 86) != 0) { volt3 = hexToShort(data_buffer, databuffer_pos, 86)/10.0; } dumpHex(data_buffer, databuffer_pos, response, 88, 6); dumpHex(data_buffer, databuffer_pos, response, 94, 2); response.concat(F("\tFrekvens: ")); response.concat(hexToShort(data_buffer, databuffer_pos, 94)/100.0); response.concat(F("Hz")); if (hexToShort(data_buffer, databuffer_pos, 94) != 0) { frekvens = hexToShort(data_buffer, databuffer_pos, 94)/100.0; } dumpHex(data_buffer, databuffer_pos, response, 96, 1); dumpHex(data_buffer, databuffer_pos, response, 97, 2); response.concat(F("\tSjekksum er ")); response.concat(validCrc16(data_buffer, databuffer_pos, 0, 97, 97) ? F("OK") : F("IKKE OK")); dumpHex(data_buffer, databuffer_pos, response, 99, 1); if (buffer_overflow) { response.concat(F("\n\n(Buffer overflowed)")); } //.send(200, F("text/plain"), response); } //**************************************************************** void HSSetup() { //************************ //Add YOUR SETUP HERE; //in_setup_mode = false; databuffer_pos = 0; buffer_overflow = false; databuffer_receive_time = 0L; Serial.begin(9600, SERIAL_MODE); Serial.setDebugOutput(false); // read_persistent_params(); //************************ } void HSloop() { //************************ //Add YOUR CODE HERE; //************************ /* To Send Data to Homeseer use SendToHS(Device,Value) Eg.. SendToHS(1,200); where 1 is the API device in homeseer and 200 is the value to send To Recieve data from Homeseer look up the FromHS array that is updated when the device value changes. Eg.. FromHS[5] would be the data from API Output device 5 All code that is located just below this block will execute regardless of connection status! You can include SendToHS() calls, however when there isn't an active connection, it will just return and continue. If you only want code to execute when HomeSeer is connected, put it inside the if statement below. */ /*Execute regardless of connection status*/ HTTPClient http; if (Serial.available()) { serialEvent(); } if (IsConnected == true) { /*Execute ONLY when HomeSeer is connected*/ handleRequest(); if(forrigeEffekt != effekt && effekt != 0) { SendToHS(1, effekt); SendToHS(2, total); SendToHS(3, volt1); SendToHS(4, volt2); SendToHS(5, volt3); SendToHS(6, frekvens); forrigeEffekt = effekt; } } } //************Do not change anything after Here*****************
  5. Fungerer hvis man bruker NodeMcu Api, men da må man sette opp koden selv. Det er ikke så avansert egentlig, bare å bruke et kodeeksempel fra nett og putte inn på riktig sted i koden du får fra arduino plugin
  6. Jeg fikk ut data frem til de kjørte ut en oppdatering som deaktiverte HAN porten, nå er det ingen spenning på den lenger (Aidon) ?
  7. Fungerer fint med i2 i HS3 med z-wave plugin 0.245 og HS3 v470 Kun endret parameter 100 til 1, ekskludert og inkludert igjen ved å trykke ca 2-3 sek på knappen på qubinoen. Da virket i2 med engang uten noe mer kluss.
  8. Er ikke det ofte bare 2 sløyfer med varmekabel, på trinn 1 er den ene kabelen på, trinn 2 den andre litt kraftigere på og på trinn 3 så er begge på?
  9. Actibus

    Z-wave utendørs bryter

    Den kan fint erstatte termostaten, den har jo igrunn ingen funksjon annet enn å være en bryter
  10. Prøvd å endre denne til 2?
  11. Fikk dette i svar fra Skagerak nå
  12. Nettleverandøren skjønner jo ikke at det har vært mulig å få ut data i utgangspunktet.. Målte spenning ut fra HAN porten nå, og målte 20-30mV, altså ingenting Enten så har de faktisk deaktivert porten, eller så har utgangen plutselig tatt kvelden.
  13. Forsøkte med et annet mbus adapter idag, samme problemet. Jeg har sendt en mail til nettleverandør for å høre om de kanskje har deaktivert utgangen/oppdatert firmware i påvente av 1/1-19
  14. Det gjelder vel kun for SDK development kit?
  15. Har forsøkt å koble av både ESP og mbus siden uten hell, siste avlesning var kl 15.12 mens jeg var på jobb, så skjedd uten at noen har vært bortpå den.
  16. Takk, men igår stoppet jeg å få data ut fra måleren. Dioden som lyste på mbus siden av kortet har sluttet å lyse også. Mulig kortet har tatt kvelden ? Skal få tak i et annet og se om det fungerer
  17. Jeg bruker dette scriptet for å logge forskjellige enheter til en SQL database, som jeg igjen viser med Grafana. Velger device ved å sette deviceID i paramterfeltet i eventet. Public Sub Main(ByVal Parms As Object) Dim devValue As Double = hs.DeviceValueEx(Parms) Dim devName As String = Nothing Dim dev As Scheduler.Classes.DeviceClass dev = hs.GetDeviceByRef(Parms) devName = dev.Name(hs) hs.WriteLog("WriteToSql - Device# " + Parms.ToString, devValue.ToString) Dim myconnect As New System.Data.SqlClient.SqlConnection myconnect.ConnectionString = "Data Source=tcp:HS3-PC,1433;Initial Catalog=HS3;Persist Security Info=True;User ID=****;Password=****" Dim mycommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand() mycommand.Connection = myconnect mycommand.CommandText = "INSERT INTO dbo.power (devRef, devName, devValue, devTime) VALUES (@Parms, @devName, @devValue, GETDATE())" myconnect.Open() Try mycommand.Parameters.AddWithValue("@Parms", Parms) mycommand.Parameters.AddWithValue("@devName", devName) mycommand.Parameters.AddWithValue("@devValue", devValue) mycommand.ExecuteNonQuery() 'MsgBox("Success") Catch ex As System.Data.SqlClient.SqlException hs.WriteLog("WriteToSql - Device# " + Parms.ToString, ex.Message) End Try myconnect.Close() End Sub
  18. Den kjører jo konstant så lenge "Any hue light in group mariell is on" bruk changes and become evt, da trigger den bare når det er en endring. Utenom det så burde den jo egentlig vente 5 min før den slår seg av
  19. Fant ut av det nå, var så enkelt som at jeg måtte selvfølgelig sette variabelen også til å være short, da fungerer det @frodegill Jeg endret litt på koden din for å bruke den mot arduino plugin (vel jeg fjernet alt jeg fant som var relatert til webserver delen) Og fikk til å sende målerstand og effekt ved å hente de ut med
  20. Ref: https://e24.no/naeringsliv/posten/posten-om-vraking-av-350-kronersgrensen-det-blir-et-kaos/24356551 Toll betaler man jo stort sett bare på klær, da sitter man igjen med momsen, gebyret f.eks Aliexpress tar for jobben er nok minimalt ifht Posten/Postnord el.
  21. Her vil forhåpentligvis de største aktørene inngå avtale slik at man betaler moms ved kjøp og da slipper gebyret
  22. Se der, aldri for gammel til å lære noe nytt ??
  23. Tror du må lage en virtuell enhet som igjen trigger eventet.
  24. Actibus

    Variabeler

    Du kan lage en virtuell enhet og kopiere siste dimme verdi til den med et enkelt scriptcommand, trigge den hver gang enheten endrer verdi. &hs.SetDeviceValueByRef(xxx, (hs.DeviceValueEx(xxx), True) Første xxx er enheten du skal sette verdien til, den virtuelle enheten, den andre xxx er enheten du skal hente verdien fra. Så kan du kjører motsatt for å hente verdien fra den virtuelle enheten
  25. Burde vært et valg iallefall, når man slettet en plugin så kunne man valgt å samtidig slette alle tilhørende enheter.
×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.