The Sensor Data Cloud

Smart Storage

Sentenai uses machine learning to intelligently organize your data so you can rapidly search for patterns, failure conditions and perform other useful temporal queries on your sensor data. Whether your data is text, numeric or geospatial, Sentenai continuously optimizes it so you can work with it faster.

  from sentenai import Sentenai, stream
  from datetime import datetime

  client = Sentenai(auth_key="XXXXXXXXXXX")

  client.put(
      stream = stream("greenhouse-controller-5"),
      event  = {
          "temperature": 55.3,
          "pressure": 83.2,
          "lux": 328
          "
        },
      timestamp = datetime.utcnow()
    )

Sophisticated Search

Sentenai's query engine understands temporal data, whether you're looking to combine multiple sensors with different sample rates or find a complicated anomaly that might occur across a whole fleet of machines, Sentenai's queries are easy to use and powerful.

  from sentenai import delta, Sentenai, stream, V
  from datetime import datetime

  sentenai = Sentenai(auth_key="XXXXXXXXXXX")
  greenhouse = stream("greenhouse-controller-5")
  weather = stream("weather-history")

  sentenai.query(
    select(start=datetime(2015,1,1))
      .span(
          weather.temperatureMax > 90,
          min=delta(days=3))
      .then(
          weather.temperatureMax < 70,
          within=delta(weeks=2)
      ), returning = {
          weather: {
              "high": V.temperatureMax,
              "low": V.temperatureMin
            },
          greenhouse: True
    }
  )

ETL, On Demand

Building ETL pipelines that process data in batches or in stream is always a tiem-consuming, error-prone task...especially if requirements change. Sentenai's on-demand ETL tools help you reshape your data to fit your models, without giving up the power of client-side abstractions like data frames.

  from sentenai import delta, Sentenai, stream, V
  from datetime import datetime

  sentenai = Sentenai(auth_key="XXXXXXXXXXX")
  greenhouse = stream("greenhouse-controller-5")

  result = sentenai.query(
    # failure temperature threshold
    select()
      .span(
          greenhouse.temperature > 90,
          min = delta(hours=1)
        )
  )

  result.sliding(
      lookback = delta(day=3),
      horizon  = delta(days=1),
      freq     = delta(days=1)
    ).inverted().tensors(greenhouse.temperature)