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

Actibus

Medlemmer
  • Innlegg

    551
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    16

Innlegg skrevet av Actibus

  1. 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

  2. @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*****************
    
    

    • Thanks 1
  3. 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 

  4. Fikk dette i svar fra Skagerak nå

     

    HAN grensesnittet er dessverre blitt utsatt til slutten av januar i 2019. Det er blitt lagt ut ny firmware på målerne som gjøre at HAN grensesnittet nå er stengt for informasjon. På grunn av øvrig funksjonalitet så kan vi dessverre ikke gå tilbake til gammel firmware. Det vil komme informasjon når HAN grensesnittet er klart på AMS målerne.

     

  5. 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

     

    grafana.PNG

  6. 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 

    Sitat

    int effekt = hexToInt(data_buffer, databuffer_pos, 48);

    [/quote] 

    Men når jeg prøver det på f. Eks spenning som jo er lik utenom hexToShort istedetfor så får jeg ikke ut noe data, prøvde også å endre den til hexToInt men fikk ikke noe da heller. 

     

    Jeg har surret mye med arduino, men dette er langt utenfor mitt felt ?

  7.  

     

    Ref: https://e24.no/naeringsliv/posten/posten-om-vraking-av-350-kronersgrensen-det-blir-et-kaos/24356551

    Sitat

    – Det er derfor de fleste land har en grense, for det blir mye arbeid med tollbehandling – enten det er dyre eller billige varer. Det er uhensiktsmessig å ta bort grensen før det er realistisk å få på plass løsninger der selgerselskapet i utlandet krever inn momsen når kunden kjøper varen, sier pressesjef i Posten, John Eckhoff, til E24.

    Løsningen i det svenske kaoset ble at Postnord prøver å inngå avtaler med de internasjonale netthandelaktørene om å legge til toll og merverdiavgift ved bestilling. Hittil er én slik avtale landet.

    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.

  8. 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 

×
×
  • 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.